完善资料让更多小伙伴认识你,还能领取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 运行完了才运行下一句;
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1018 浏览 1 评论
1849 浏览 0 评论
1830 浏览 1 评论
3254 浏览 5 评论
3581 浏览 9 评论
1021浏览 1评论
1850浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1360浏览 1评论
1852浏览 0评论
1178浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 03:20 , Processed in 0.501205 second(s), Total 45, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3610