完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,最近在学习FreeRTOS的过程中遇到一个问题:在最低优先级的任务中使用printf函数后,系统就会一直保持在最低优先级的任务中,退步出来,把printf这行代码屏蔽掉,任务又能够恢复切换,代码如下,请各位指教一二,不胜感激。
首先定义3个任务的参数 1个start 2个led(下面函数都是普通创建的函数,如没有需要可直接跳转到最下面蓝色标记的位置 其中led1优先级为3 led2优先级为2) /////////////////start_configure/////////////////// #define start_Stack 150 //设置堆栈大小 #define start_Pro 1 //设置优先级 TaskHandle_t start_Handle; //设置句柄 void start_task(void *pvParameters); //初始化函数 /////////////////led1_configure/////////////////// #define led1_Stack 215 //设置堆栈大小 #define led1_Pro 3 //设置优先级 TaskHandle_t led1_Handle; //设置句柄 void led1_task(void *pvParameters); //初始化函数 /////////////////led2_configure/////////////////// #define led2_Stack 25 //设置堆栈大小 #define led2_Pro 2 //设置优先级 TaskHandle_t led2_Handle; //设置句柄 void led2_task(void *pvParameters); //初始化函数 创建main函数 包含一个start任务 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 delay_init(); //延时函数初始化 uart_init(115200); //初始化串口 LED_Init(); // key_init(); //任务句柄 xTaskCreate( (TaskFunction_t) start_task, (const char * ) "start_task", (uint16_t ) start_Stack, (void * ) NULL, (UBaseType_t ) start_Pro, (TaskHandle_t *) &start_Handle ); vTaskStartScheduler(); //开启任务调度 } start任务中创建两个led任务 并创建一个事件标志组 void start_task(void *pvParameters) { taskENTER_CRITICAL(); led2_EventHandle=xEventGroupCreate(); if(led2_EventHandle==NULL) printf("the led2_EventHandle created failedrn"); xTaskCreate((TaskFunction_t) led1_task, (const char * ) "led1_task", (uint16_t ) led1_Stack, (void * ) NULL, (UBaseType_t ) led1_Pro, (TaskHandle_t *) &led1_Handle ); xTaskCreate((TaskFunction_t) led2_task, (const char * ) "led2_task", (uint16_t ) led2_Stack, (void * ) NULL, (UBaseType_t ) led2_Pro, (TaskHandle_t *) &led2_Handle ); vTaskDelete( start_Handle ); taskEXIT_CRITICAL(); } 下面创建的是两个led任务 void led1_task(void *pvParameters) { u32 times=0; while(1) { LED1=~LED1; vTaskDelay(500); times++; if(times%6==0) xEventGroupSetBits(led2_EventHandle,0x01); else if(times%8==0) xEventGroupSetBits(led2_EventHandle,0x02); } } void led2_task(void *pvParameters) { while(1) { Current_led2_Event=xEventGroupWaitBits(( EventGroupHandle_t ) led2_EventHandle, (EventBits_t ) 0x03, (BaseType_t ) pdTRUE, (BaseType_t ) pdTRUE, (TickType_t ) portMAX_DELAY); //printf("the data is %#drn",Current_led2_Event);////////////////////////////////////////////////////////////////////////////////////////////////关键的这一行代码 LED0=~LED0; portYIELD(); } } |
|
相关推荐
1个回答
|
|
原因好像是因为 printf 会一直阻塞,直到printf 运行完了才运行下一句;
|
|
|
|
只有小组成员才能发言,加入小组>>
788 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1068浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 06:22 , Processed in 1.052489 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号