ucosiii二值信号量
刚接触ucosiii 将信号量与裸机的标志位进行对比,不知是否正确,还望各路大神指点。
1、二值信号量与裸机标志位一些雷同的地方
ucosiii:二值信号量 Sem | 裸机:事件标志位 Flg |
---|---|
释放信号量:OSSemPost() | 事件发生,标志位置1:Flg=1 |
获取信号量:OSSemPend() | 在系统轮询或中断中,判断标志位被置1:执行对应的功能 |
2、程序实现区别
2.1释放信号量
static void AppTask1(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE) { //任务体
if( KEY_scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) ) //如果KEY1被单击
OSSemPost((OS_SEM *)&SemOfKey, //发布SemOfKey
(OS_OPT )OS_OPT_POST_ALL, //发布给所有等待任务
(OS_ERR *)&err); //返回错误类型
OSTimeDlyHMSM ( 0, 0, 0, 20, OS_OPT_TIME_DLY, & err );
}
}
2.2获取信号量
static void AppTask2(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while(DEF_TRUE){ //任务体
OSSemPend ((OS_SEM *)&SemOfKey, //等待该信号量被发布
(OS_TICK )0, //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //如果没有信号量可用就等待
(CPU_TS *)0, //获取信号量最后一次被发布的时间戳
(OS_ERR *)&err); //返回错误类型
LED1_TOGGLE; //切换LED1的亮灭状态
}
}
2.3裸机事件发生,产生标志位
//按键中断产生标志位
void KEY1_EXTI_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY1_EXTI_Line)!=RESET)
{
KEY_Down_Flg=1;
}
EXTI_ClearITPendingBit(KEY1_EXTI_Line);
}
2.3裸机获取事件产生的标志位
int main()
{
LED_Init();
EXTI_init();
while(1)
{
if(KEY_Down_Flg)//主函数轮训等待标志位
{
KEY_Down_Flg=0;
LED4_TOGGLE;
}
}
}