ucos iii创建信号量
在uC/OS-III中创建信号量可以使用OS_SEM_CREATE宏,其定义如下:
#define OS_SEM_CREATE(p_sem, p_name, cnt, err) \
do { \
*(p_sem) = OSSemCreate(cnt); \
if (*(p_sem) != NULL) { \
OSObjDbgListAdd(*(p_sem), \
(OS_OBJ_TYPE_SEM << 24u) | (OS_OBJ_TYPE_FLAG_WAIT | OS_OBJ_TYPE_FLAG_PER_TASK), \
p_name); \
(err) = OS_ERR_NONE; \
} else { \
(err) = OS_ERR_SEM_CREATE_FAILED; \
} \
} while (0)
其中,p_sem为指向信号量控制块指针的指针,p_name为信号量的名称,cnt为信号量的初始计数器值,err为创建信号量的返回值。
示例代码:
#include <stdio.h>
#include "os.h"
#define TASK_STK_SIZE 512u
static OS_TCB Task1TCB;
static CPU_STK Task1Stk[TASK_STK_SIZE];
static OS_TCB Task2TCB;
static CPU_STK Task2Stk[TASK_STK_SIZE];
static OS_SEM Sem1;
static OS_SEM Sem2;
static void Task1(void *p_arg)
{
OS_ERR err;
while (1) {
printf("Task 1: wait for Sem1\n");
OSSemPend(&Sem1, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
printf("Task 1: acquire Sem1\n");
printf("Task 1: release Sem2\n");
OSSemPost(&Sem2, OS_OPT_POST_1, &err);
OSTimeDlyHMSM(0, 0, 0, 500u, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
static void Task2(void *p_arg)
{
OS_ERR err;
while (1) {
printf("Task 2: wait for Sem2\n");
OSSemPend(&Sem2, 0, OS_OPT_PEND_BLOCKING, NULL, &err);
printf("Task 2: acquire Sem2\n");
printf("Task 2: release Sem1\n");
OSSemPost(&Sem1, OS_OPT_POST_1, &err);
OSTimeDlyHMSM(0, 0, 0, 500u, OS_OPT_TIME_HMSM_STRICT, &err);
}
}
int main()
{
OS_ERR err;
// 初始化uC/OS-III内核
OSInit(&err);
// 创建信号量
OS_SEM_CREATE(&Sem1, "Sem1", 1u, err);
OS_SEM_CREATE(&Sem2, "Sem2", 0u, err);
// 创建任务
OSTaskCreate(&Task1TCB, "Task 1", Task1, NULL, 2u, &Task1Stk[0], TASK_STK_SIZE / 10u, TASK_STK_SIZE, 0u, 0u, NULL, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
OSTaskCreate(&Task2TCB, "Task 2", Task2, NULL, 2u, &Task2Stk[0], TASK_STK_SIZE / 10u, TASK_STK_SIZE, 0u, 0u, NULL, OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR, &err);
// 启动多任务调度
OSStart(&err);
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/d75F 著作权归作者所有。请勿转载和采集!