问题描述:小弟最近在学习信号同步,使用的是信号量集,通过LED1_Task任务释放一个信号量,通过按键中断释放另一个信号量,在Disp_Task任务中用串口打印出来~~~
问题求解:
问题1:如下是我写的程序,它一直在打印,根本停不下来(我想达到的效果是按键每按一次,在串口上打印一次,),恳请大神指教
问题2:假设我有Task1(prio=1),Task2(prio=2),Task3(prio=3),那ucos在执行任务调度之后,
ucos是一直在执行Task1,还是执行完Task1 一次之后,转而去执行其他任务(Task1一直保持最高优先级)?
int main(void)
{
INT8U err;
USART1_Config(115200);
OSInit();
err = OSTaskCreate(Start_Task, (void *)0,&Start_Task_Stk[START_TASK_STK_SIZE - 1],3);/*在main()函数中创建一个Start_Task任务 */
OSStart();
return (0);
}
static void Start_Task(void* p_arg)
{
OS_CPU_SysTickInit();/*初始化SysTick,LED,EXTI*/
LED1_Init();
EXTI_PA0_Config();
OSTaskCreate(Disp_Task,(void *)0,&Disp_Task_Stk[DISP_TASK_STK_SIZE-1],5);/*创建Disp_Task任务*/
OSTaskCreate(LED1_Task,(void *)0,&LED1_Task_Stk[LED1_TASK_STK_SIZE-1],7);/*创建LED1_Task任务*/
OSTaskDel(OS_PRIO_SELF);/*删除Start_Task任务*/
}
static void Disp_Task(void *p_arg)
{
INT8U err;
p_arg=p_arg;
FLAGW=OSFlagCreate(0,&err);/*创建信号量集*/
while(1)
{
OSFlagPend(FLAGW,0x03,OS_FLAG_WAIT_SET_ALL,0,&err);
printf("已经接收到信号量集");
OSTimeDly(OS_TICKS_PER_SEC);
}
}
static void LED1_Task(void *p_arg)
{
INT8U err;
p_arg=p_arg;
printf("Ö´ÐÐLED_TaskÈÎÎñ\n");
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
OSFlagPost(FLAGW,0x01,OS_FLAG_SET,&err);/*释放信号量集*/
}
}
void EXTI0_IRQHandler(void)
{
INT8U err;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
OSIntEnter();
OS_EXIT_CRITICAL();
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
printf("按键被按下");
OSFlagPost(FLAGW,0x02,OS_FLAG_SET,&err);/*发送信号量*/
EXTI_ClearITPendingBit(EXTI_Line0);
}
OSIntExit();
}
|