diff --git a/Demo-Service/重入访问/reent_semaph.c b/Demo-Service/重入访问/reent_semaph.c new file mode 100644 index 0000000..9e16be9 --- /dev/null +++ b/Demo-Service/重入访问/reent_semaph.c @@ -0,0 +1,80 @@ +/**************************************************************************//** + * @item CosyOS-III 例程(服务应用) + * @file reent_semaph.c + * @brief 重入访问_计数信号量 + * @details 通过计数信号量的{获取<-归还},实现在任务中对任务级可重入资源的重入访问。 + * @note 可实现超时处理机制。 + * @author 迟凯峰 + * @version V1.0.0 + * @date 2025.10.25 + ******************************************************************************/ + +#if 1 /* 编译开关 */ + +#include "CosyOS.H" + +uCreateSem(sem_0, 2, 2); // 创建计数信号量,用于重入访问,初始值=最大值=资源数量 + +/* task_1 */ +uCreateTask(task_1, 1, 384, 0, 0) +{ + while(1){ + if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0,不再支持超时处理 + /* 重入访问 任务级可重入资源 开始 */ + + /* 重入访问 任务级可重入资源 结束 */ + uBackSem(sem_0); + } + else{ + /* 超时处理 开始 */ + + /* 超时处理 结束 */ + } + } +} + +/* task_2 */ +uCreateTask(task_2, 2, 384, 0, 0) +{ + while(1){ + if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0,不再支持超时处理 + /* 重入访问 任务级可重入资源 开始 */ + + /* 重入访问 任务级可重入资源 结束 */ + uBackSem(sem_0); + } + else{ + /* 超时处理 开始 */ + + /* 超时处理 结束 */ + } + } +} + +/* task_3 */ +uCreateTask(task_3, 3, 384, 0, 0) +{ + while(1){ + if(uTakeSem(sem_0, xTick_ms(500))){ // 如果超时时间为~0,不再支持超时处理 + /* 重入访问 任务级可重入资源 开始 */ + + /* 重入访问 任务级可重入资源 结束 */ + uBackSem(sem_0); + } + else{ + /* 超时处理 开始 */ + + /* 超时处理 结束 */ + } + } +} + +/* 启动钩子 */ +void start_hook(void) +{ + uStartTask_Ready(task_1); // 启动task_1,初始状态为就绪状态 + uStartTask_Ready(task_2); // 启动task_2,初始状态为就绪状态 + uStartTask_Ready(task_3); // 启动task_3,初始状态为就绪状态 +} + +#endif