OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 420|回复: 4

最近使用Freertos时候遇到奇怪问题,求教

[复制链接]

  离线 

15

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2015-1-19
在线时间
29 小时
发表于 2018-6-23 14:53:47 | 显示全部楼层 |阅读模式
/è???ó??è??
#define START_TASK_PRIO                2
//è???????′óD?        
#define START_STK_SIZE                 128
//è?????±ú
TaskHandle_t StartTask_Handler;
//è???oˉêy
void start_task(void *pvParameters);

//è???ó??è??
#define LED0_TASK_PRIO                11
//è???????′óD?        
#define LED0_STK_SIZE                 1024
//è?????±ú
TaskHandle_t LED0Task_Handler;
//è???oˉêy
void led0_task(void *pvParameters);

//è???ó??è??
#define LED1_TASK_PRIO                20
//è???????′óD?        
#define LED1_STK_SIZE                 1024
//è?????±ú
TaskHandle_t LED1Task_Handler;
//è???oˉêy
void led1_task(void *pvParameters);

//è???ó??è??
#define LED2_TASK_PRIO                11
//è???????′óD?        
#define LED2_STK_SIZE                 1024  
//è?????±ú
TaskHandle_t LED2Task_Handler;
//è???oˉêy
void led2_task(void *pvParameters);


int main(void)
{
                System_Init();
    xTaskCreate((TaskFunction_t )start_task,            //è???oˉêy
                (const char*    )"start_task",          //è?????3?
                (uint16_t       )START_STK_SIZE,        //è???????′óD?
                (void*          )NULL,                  //′?μY??è???oˉêyμ?2?êy
                (UBaseType_t    )START_TASK_PRIO,       //è???ó??è??
                (TaskHandle_t*  )&StartTask_Handler);   //è?????±ú              
    vTaskStartScheduler();          //?a??è???μ÷?è
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //??è?áù????
    xTaskCreate((TaskFunction_t )led0_task,            
                (const char*    )"led0_task",           
                (uint16_t       )LED0_STK_SIZE,
                (void*          )NULL,                                
                (UBaseType_t    )LED0_TASK_PRIO,        
                (TaskHandle_t*  )&LED0Task_Handler);   
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);   

    xTaskCreate((TaskFunction_t )led2_task,     
                (const char*    )"led2_task",   
                (uint16_t       )LED2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )LED2_TASK_PRIO,
                (TaskHandle_t*  )&LED2Task_Handler);  
                                                               
    vTaskDelete(StartTask_Handler); //é?3y?aê?è???
    taskEXIT_CRITICAL();            //í?3?áù????
        
}

void led0_task(void *pvParameters)
{
         
    while(1)
    {
        vTaskDelay(200);
    }
}   

void led2_task(void *pvParameters)
{
    while(1)
    {

        vTaskDelay(20);
    }
}   

void led1_task(void *pvParameters)
{
    while(1)
    {
        vTaskDelay(6);
    }
}


最近使用FreertOS时候,遇到一个莫名其妙的问题,求教各位大侠了。就是以上简单的几个任务,当led0_task vTaskDelay(200);中的时间片大于300的时候,我调试发现任务切换不过去了,当小于或等于200,就完全OK.我试过300、400、500、1000都无法正常切换任务。使用的是F205系列单片机
堆栈设置的是#define configTOTAL_HEAP_SIZE                                        ((size_t)(35*1024))    应该完全够用
回复

使用道具 举报

  离线 

74

主题

6678

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
13386
金钱
13386
注册时间
2013-11-13
在线时间
1606 小时
发表于 2018-6-23 14:57:39 | 显示全部楼层
检查时钟配置,例程里面很多都用的500
回复 支持 反对

使用道具 举报

  离线 

15

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2015-1-19
在线时间
29 小时
 楼主| 发表于 2018-6-23 15:01:51 | 显示全部楼层
zuozhongkai 发表于 2018-6-23 14:57
检查时钟配置,例程里面很多都用的500

用的内部时钟120M,我以前使用1000都没问题,不过是外部晶振
回复 支持 反对

使用道具 举报

  离线 

20

主题

704

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2271
金钱
2271
注册时间
2017-4-14
在线时间
756 小时
发表于 2018-6-23 17:22:00 | 显示全部楼层
看led0 led2优先级相同,是不是没使能时间片调度,不过也不知道是不是这个问题
回复 支持 反对

使用道具 举报

  离线 

15

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2015-1-19
在线时间
29 小时
 楼主| 发表于 2018-6-23 22:00:20 | 显示全部楼层
275891381 发表于 2018-6-23 17:22
看led0 led2优先级相同,是不是没使能时间片调度,不过也不知道是不是这个问题

使能了,关键是优先级改成不一样的也没有用。这个freertoS是我一千在stmf103上用过的,绝对没问题,不过那个是外部晶振。现在的这款是f205,我是直接复制粘贴过来。按理论来说都是CM3内核,应该不存在问题。不过今天用读取vTaskDelay(6);运行时间,才5.6几ms,虽然是内部晶振,不过差别也没这么大吧。不知道是不是时钟出错了,后天再仔细看看
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

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

GMT+8, 2018-11-14 19:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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