在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;
}
``
ucos iii创建信号量

原文地址: https://www.cveoy.top/t/topic/d75F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录