OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

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

查看: 795|回复: 10

freertos移植到另外一块板子,开两个任务,其中只能运行一个

[复制链接]

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
发表于 2018-1-29 15:19:33 | 显示全部楼层 |阅读模式
5金钱
照着原子的freertos移植到另外一块板子,开两个任务,其中只能运行一个。
[AppleScript] 纯文本查看 复制代码
#define START_TASK_PRIO 1
#define START_STK_SIZE  128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);

#define LED1_TASK_PRIO 2
#define LED1_STK_SIZE  100
TaskHandle_t LED1Task_Handler;
void led1_task(void *pvParameters);

#define LED2_TASK_PRIO 3
#define LED2_STK_SIZE  100
TaskHandle_t LED2Task_Handler;
void led2_task(void *pvParameters);


[AppleScript] 纯文本查看 复制代码
//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度


[AppleScript] 纯文本查看 复制代码
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED1任务
    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);   
    //创建LED2任务
    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); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}


任务函数就是LED闪亮,就只有一个LED闪。

最佳答案

查看完整内容[请看2#楼]

找到问题了,自己移植原子的,没用的sys文件,函数调度出现问题了,后面改用FreeRTOS的sysTick就正常了。
回复

使用道具 举报

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
 楼主| 发表于 2018-1-30 15:51:49 | 显示全部楼层
275891381 发表于 2018-1-30 10:14
你这没有任务阻塞时间,优先级有事不同的肯定只能执行高优先级的那个呀,

[AppleScript] 纯文本查看 复制代码
//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_PIN);
        vTaskDelay(200);
    }
}
//LED2任务函数 
void led2_task(void *pvParameters)
{
    while(1)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
        HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
        vTaskDelay(500);
    }
}


用系统的延时,三个灯都亮了,就是不会闪
回复

使用道具 举报

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
 楼主| 发表于 2018-1-29 15:19:34 | 显示全部楼层
275891381 发表于 2018-1-30 10:14
你这没有任务阻塞时间,优先级有事不同的肯定只能执行高优先级的那个呀,

找到问题了,自己移植原子的,没用的sys文件,函数调度出现问题了,后面改用FreeRTOS的sysTick就正常了。
回复

使用道具 举报

  离线 

55

主题

6090

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
11974
金钱
11974
注册时间
2013-11-13
在线时间
1310 小时
发表于 2018-1-29 15:43:06 | 显示全部楼层
检查你的任务都有没有创建成功!
回复

使用道具 举报

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
 楼主| 发表于 2018-1-29 15:51:19 | 显示全部楼层
zuozhongkai 发表于 2018-1-29 15:43
检查你的任务都有没有创建成功!

怎么检查,我发现把优先级换一下,就是把2换3,把3的换2,另外一个灯就闪了,就是有一个不闪。
回复

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-1-29
在线时间
1 小时
发表于 2018-1-29 16:40:22 | 显示全部楼层
可以看下你的LED1,2的任务函数吗
回复

使用道具 举报

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
 楼主| 发表于 2018-1-29 16:44:03 | 显示全部楼层
goodboy1838 发表于 2018-1-29 16:40
可以看下你的LED1,2的任务函数吗

[AppleScript] 纯文本查看 复制代码
//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
//        HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
//        HAL_Delay(200);
        HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_PIN);
        HAL_Delay(200);
    }
}
//LED2任务函数 
void led2_task(void *pvParameters)
{
    while(1)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_PIN);
        HAL_Delay(200);
        HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
        HAL_Delay(200);
    }
}
回复

使用道具 举报

  离线 

9

主题

1254

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4086
金钱
4086
注册时间
2013-3-8
在线时间
529 小时
发表于 2018-1-29 16:52:25 | 显示全部楼层
仙景 发表于 2018-1-29 16:44
[mw_shl_code=applescript,true]//LED1任务函数
void led1_task(void *pvParameters)
{

不能用HAL_Delay(200);这个吧。应该用freeRTOS系统带的延时函数.
回复

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-1-29
在线时间
1 小时
发表于 2018-1-29 17:15:46 | 显示全部楼层
augustedward 发表于 2018-1-29 16:52
不能用HAL_Delay(200);这个吧。应该用freeRTOS系统带的延时函数.

是的,要使用vTaskDelay(),你用的是什么开发板?怎么还有LED3,我的开发板只有LED0,LED1
回复

使用道具 举报

  离线 

2

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-2-11
在线时间
86 小时
 楼主| 发表于 2018-1-30 09:13:35 | 显示全部楼层
goodboy1838 发表于 2018-1-29 17:15
是的,要使用vTaskDelay(),你用的是什么开发板?怎么还有LED3,我的开发板只有LED0,LED1

我的是L496ZG,我不用那几个延时,还是不行的,还没找到问题。我再看看
回复

使用道具 举报

  离线 

12

主题

186

帖子

1

精华

高级会员

Rank: 4

积分
730
金钱
730
注册时间
2017-4-14
在线时间
284 小时
发表于 2018-1-30 10:14:47 | 显示全部楼层
仙景 发表于 2018-1-30 09:13
我的是L496ZG,我不用那几个延时,还是不行的,还没找到问题。我再看看

你这没有任务阻塞时间,优先级有事不同的肯定只能执行高优先级的那个呀,
回复

使用道具 举报

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

本版积分规则




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

GMT+8, 2018-2-24 00:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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