初级会员
- 积分
- 79
- 金钱
- 79
- 注册时间
- 2017-4-6
- 在线时间
- 13 小时
|
大家好,最近在学习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 failed\r\n");
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 %#d\r\n",Current_led2_Event);////////////////////////////////////////////////////////////////////////////////////////////////关键的这一行代码
LED0=~LED0;
portYIELD();
}
}
|
|