rsoc/Day1/semaphore_sample.c

102 lines
3.1 KiB
C
Raw Normal View History

2024-07-23 17:15:36 +08:00
#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);