rsoc/Day1/semaphore_sample.c

102 lines
3.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_TIMESLICE 5
/* 指向信号量的指针 */
static rt_sem_t dynamic_sem = RT_NULL;
static char thread1_stack[1024];
static struct rt_thread thread1;
/* 线程1入口函数 */
static void rt_thread1_entry(void *parameter)
{
static rt_uint8_t count = 0;
while(1)
{
if(count <= 100)
{
count++; // 计数器递增
}
else
{
return; // 计数器大于100时退出线程
}
/* count 每计数 10 次,就释放一次信号量 */
if(0 == (count % 10))
{
rt_kprintf("t1 release a dynamic semaphore.\n");
rt_sem_release(dynamic_sem); // 释放信号量
}
}
}
static char thread2_stack[1024];
static struct rt_thread thread2;
/* 线程2入口函数 */
static void rt_thread2_entry(void *parameter)
{
static rt_err_t result;
static rt_uint8_t number = 0;
while(1)
{
/* 永久方式等待信号量,获取到信号量,则执行 number 自加的操作 */
result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);
if (result != RT_EOK)
{
rt_kprintf("t2 take a dynamic semaphore, failed.\n");
rt_sem_delete(dynamic_sem); // 删除信号量
return;
}
else
{
number++; // 信号量获取成功number 自加
rt_kprintf("t2 take a dynamic semaphore. number = %d\n", number);
}
}
}
/* 信号量示例的初始化 */
int semaphore_sample(void)
{
/* 创建一个动态信号量,初始值是 0 */
dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);
if (dynamic_sem == RT_NULL)
{
rt_kprintf("create dynamic semaphore failed.\n");
return -1;
}
else
{
rt_kprintf("create done. dynamic semaphore value = 0.\n");
}
/* 初始化并启动线程1 */
rt_thread_init(&thread1,
"thread1", /* 线程名称 */
rt_thread1_entry, /* 线程入口函数 */
RT_NULL, /* 入口函数参数 */
&thread1_stack[0], /* 线程栈起始地址 */
sizeof(thread1_stack), /* 线程栈大小 */
THREAD_PRIORITY, THREAD_TIMESLICE); /* 线程优先级和时间片大小 */
rt_thread_startup(&thread1);
/* 初始化并启动线程2 */
rt_thread_init(&thread2,
"thread2", /* 线程名称 */
rt_thread2_entry, /* 线程入口函数 */
RT_NULL, /* 入口函数参数 */
&thread2_stack[0], /* 线程栈起始地址 */
sizeof(thread2_stack), /* 线程栈大小 */
THREAD_PRIORITY-1, THREAD_TIMESLICE); /* 线程优先级和时间片大小 */
rt_thread_startup(&thread2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(semaphore_sample, semaphore sample);