- 简述
- uC/OS提供任务信号量这个功能,每个任务都有一个32位(用户自定义位宽)的信号量值SemCtr,这个信号量值在任务控制块中包含的,是任务独有的一个信号量通知值
- 多数情况下,任务信号量可以替代内核对象的二进制信号量、计数信号量
- 特点
- 任务信号量更加灵活、速度快、节省RAM、无需单独创建信号量
- 只能有一个任务接收信号,必须指定接收信号量的任务,才能正确发送信号量,
- 相关函数
- OSTaskSemPend(); 等待任务信号量
- OSTaskSemPendAbort(); 取消等待任务信号量
- OSTaskSemPost(); 发布任务信号量
- OSTaskSemSet(); 强行设置任务信号量计数
- 常用函数: 发布、等待任务信号量
- 例程
- 任务信号量代替二进制信号量
- 发送
/************************************************** * 函数名:static void AppTaskKey(void *p_arg) * 描述 :按键检测 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskKey(void *p_arg) { OS_ERR err; uint8_t KeyValue; (void)p_arg; for(;;) { KeyValue = BSP_KEY_Scan(0); if(KeyValue == Key0_PH3_Value) { printf("\r\n 发送任务信号量 \r\n"); OSTaskSemPost( (OS_TCB *)&AppTaskLedTCB, //目标任务 (OS_OPT )OS_OPT_POST_NONE, //没选项要求 (OS_ERR *)&err); //返回错误类型 } OSTimeDlyHMSM ( 0, 0, 0, 20, OS_OPT_TIME_DLY, & err ); //每20ms扫描一次 } }
- 接收
/************************************************** * 函数名:static void AppTaskLed(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskLed(void *p_arg) { OS_ERR err; CPU_TS ts; CPU_INT32U cpu_clk_freq; (void)p_arg; cpu_clk_freq = BSP_CPU_ClkFreq(); //获取CPU时钟,时间戳以该时钟计数 for(;;) { OSTaskSemPend( (OS_TICK )0, //无期限等待 (OS_OPT )OS_OPT_PEND_BLOCKING, //如果信号量不可用就等待 (CPU_TS *)&ts, //获取信号量被发布的时间戳 (OS_ERR *)&err); //返回错误类型 ts = OS_TS_GET() - ts; //计算信号量发布到接收的时间差 LED1_TOGGLE; printf("\r\n 任务信号量从被发送到被接收的时间差是%dus \r\n", ts / (cpu_clk_freq / 1000000) ); } }
- 发送
- 任务信号量代替计数信号量
- 发送
- 接收
- 任务信号量代替二进制信号量
- 下载验证
- 任务信号量代替二进制信号量
- 任务信号量代替计数信号量
- 总结
- 两个任务优先级相同的函数,调用同一个按键检测,后执行的任务,检测不到按键,应该是按键检测程序有问题
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【9】uC/OS-III应用开发————>任务信号量(STM32F767)
最新推荐文章于 2020-07-09 16:04:47 发布