OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 247|回复: 1

STM32F103中printf的问题

[复制链接]

  离线 

4

主题

10

帖子

0

精华

新手上路

Rank: 1

积分
38
金钱
38
注册时间
2017-4-6
在线时间
3 小时
发表于 2017-9-3 09:58:43 | 显示全部楼层 |阅读模式
正点原子公众号
大家好,最近在学习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();
        }
}


回复

使用道具 举报

  离线 

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-1-27
在线时间
14 小时
发表于 2017-9-24 21:33:57 | 显示全部楼层
原因好像是因为 printf  会一直阻塞,直到printf  运行完了才运行下一句;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-23 04:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */