官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
代码:
#define THREAD_PRIORITY 7 //优先级
#define THREAD_STACK_SIZE 512 //内存大小
#define THREAD_TIMESLICE 5 //线程一次调度能够运行的最大时间长度
//指向信号量的指针
static rt_sem_t dynamic_sem = RT_NULL;
//信号量应用示例,一个释放,一个接受
/******************************************************************************************
*** 函数名称: semaphore_thread1_entry
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程1,释放信号量
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void semaphore_thread1_entry(void *parameter)
{
static rt_uint8_t count =0;
while(1)
{
if(count <= 10) //释放10次信号量
{
count ++;
rt_kprintf("thread1 release count %d\n",count);
rt_sem_release(dynamic_sem);
}
else if(count == 11)
{
count ++;
rt_kprintf("thread1 release over\n");
}
else
{
}
rt_thread_mdelay(1000);
}
}
/******************************************************************************************
*** 函数名称: semaphore_thread2_entry
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:线程2,接收信号量
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
static void semaphore_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("thread2 take semphore, failed \n"); //获取错误
rt_sem_delete(dynamic_sem); //删除信号量以释放系统资源
return;
}
else
{
rt_kprintf("thread2 take count %d\n", ++number);
}
}
}
/******************************************************************************************
*** 函数名称: thread_semaphore
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:创建线程
*** 链 接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
*** 编者 时间 版本
*** wagnlu 2020/11/16 V0.1
******************************************************************************************/
int thread_semaphore(void *parameter)
{
//创建一个动态信号量,初始值 0, 先进先出
dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO);
if(dynamic_sem == RT_NULL)
{
rt_kprintf("create dynamic semaphore failed\n");
return -1;
}
else
{
rt_kprintf("create done,dynamic_sem value 0\n");
}
rt_thread_t tid = RT_NULL; //创建一个线程句柄
tid = rt_thread_create( "thread1", //线程名称
semaphore_thread1_entry, //线程入口函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //线程栈,单位字节
THREAD_PRIORITY, //线程的优先级
THREAD_TIMESLICE); //线程的时间片大小
if(tid != RT_NULL) //获得线程控制块,启动这个线程
{
rt_thread_startup(tid);
}
tid = rt_thread_create( "thrad2", //线程名称
semaphore_thread2_entry, //线程入口函数
RT_NULL, //线程入口函数参数
THREAD_STACK_SIZE, //线程栈,单位字节
THREAD_PRIORITY, //线程的优先级
THREAD_TIMESLICE); //线程的时间片大小
if(tid != RT_NULL)
{
rt_thread_startup(tid); //获得线程控制块,启动这个线程
}
}
MSH_CMD_EXPORT(thread_semaphore, thread semaphore); //到处msh命令
效果