OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2192|回复: 4

freertos只能创建三个任务,多一个系统就不运行

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-4
在线时间
8 小时
发表于 2019-8-26 20:18:55 | 显示全部楼层 |阅读模式
1金钱
从历程移植的,创建三个系统能运行,多一个就不运行了
  1. // 开始任务 任务优先级
  2. #define START_TASK_PRIO                1
  3. //任务堆栈大小       
  4. #define START_STK_SIZE                 512  
  5. //任务句柄
  6. TaskHandle_t StartTask_Handler;
  7. //任务函数
  8. void start_task(void *pvParameters);

  9. // LED 任务优先级
  10. #define LED0_TASK_PRIO                2
  11. //任务堆栈大小       
  12. #define LED0_STK_SIZE                 50  
  13. //任务句柄
  14. TaskHandle_t LED0Task_Handler;
  15. //任务函数
  16. void led0_task(void *pvParameters);

  17. //  任务优先级
  18. #define PID_TASK_PRIO                3
  19. //任务堆栈大小       
  20. #define PID_STK_SIZE                 256  
  21. //任务句柄
  22. TaskHandle_t PIDTask_Handler;
  23. //任务函数
  24. void pid_task(void *pvParameters);

  25. // 串口2 任务优先级
  26. #define UART2_TASK_PRIO                4
  27. //任务堆栈大小       
  28. #define UART2_STK_SIZE                 256  
  29. //任务句柄
  30. TaskHandle_t UART2Task_Handler;
  31. //任务函数
  32. void uart2_task(void *pvParameters);


  33. /**
  34.   * 函数功能: 主函数.
  35.   * 输入参数: 无
  36.   * 返 回 值: 无
  37.   * 说    明: 无
  38.   */
  39. int main(void)
  40. {
  41.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  42.   HAL_Init();
  43.   /* 配置系统时钟 */
  44.   SystemClock_Config();
  45.        
  46.   /* 初始化IO口配置 */
  47.   MX_GPIO_Init();
  48.        
  49.         Power_Control(1,1);
  50.        
  51.         Power_Control(4,1);
  52.        
  53.         MX_CAN_Init();
  54.   HAL_CAN_Receive_IT(&hCAN, CAN_FIFO0);
  55.        
  56.         MX_USARTx_Init();
  57.         /* 使能接收,进入中断回调函数 */
  58.   HAL_UART_Receive_IT(&husartx,&aRxBuffer,1);
  59.        
  60.         /* 初始化定时器配置 */
  61.         BASIC_TIMx_Init();
  62.   HAL_TIM6_Base_Start();
  63.        
  64.         //创建开始任务
  65.         xTaskCreate((TaskFunction_t )start_task,            //任务函数
  66.                                                         (const char*    )"start_task",          //任务名称
  67.                                                         (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  68.                                                         (void*          )NULL,                  //传递给任务函数的参数
  69.                                                         (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  70.                                                         (TaskHandle_t*  )&StartTask_Handler);   //任务句柄
  71.                                                        
  72.         vTaskStartScheduler();          //开启任务调度
  73.                                                        
  74. }
  75. /* 函数体 --------------------------------------------------------------------*/

  76. //开始任务任务函数
  77. void start_task(void *pvParameters)
  78. {
  79.     taskENTER_CRITICAL();           //进入临界区
  80.        
  81.     //创建LED0任务
  82.     xTaskCreate((TaskFunction_t )led0_task,            
  83.                 (const char*    )"led0_task",          
  84.                 (uint16_t       )LED0_STK_SIZE,
  85.                 (void*          )NULL,                               
  86.                 (UBaseType_t    )LED0_TASK_PRIO,       
  87.                 (TaskHandle_t*  )&LED0Task_Handler);
  88.                                                                
  89.     xTaskCreate((TaskFunction_t )pid_task,            
  90.                 (const char*    )"pid_task",          
  91.                 (uint16_t       )PID_STK_SIZE,
  92.                 (void*          )NULL,                               
  93.                 (UBaseType_t    )PID_TASK_PRIO,       
  94.                 (TaskHandle_t*  )&PIDTask_Handler);  
  95.                                                                
  96.     //创建UART任务
  97.     xTaskCreate((TaskFunction_t )uart2_task,     
  98.                 (const char*    )"uart2_task",   
  99.                 (uint16_t       )UART2_STK_SIZE,
  100.                 (void*          )NULL,
  101.                 (UBaseType_t    )UART2_TASK_PRIO,
  102.                 (TaskHandle_t*  )&UART2Task_Handler);        
  103.                                                                
  104.                                                                
  105.     vTaskDelete(StartTask_Handler); //删除开始任务       
  106.                                                                
  107.     taskEXIT_CRITICAL();            //退出临界区
  108. }

  109. //LED0任务函数
  110. void led0_task(void *pvParameters)
  111. {
  112.     while(1)
  113.     {
  114.         Led_1_Control(-1);
  115.         vTaskDelay(500);
  116.     }
  117. }   

  118. void pid_task(void *pvParameters)
  119. {
  120.     while(1)
  121.     {
  122.         Led_2_Control(-1);
  123.         vTaskDelay(500);
  124.     }
  125. }
  126. //uart2任务函数
  127. void uart2_task(void *pvParameters)
  128. {
  129.    while(1)
  130.    {
  131.                         if(RxBuf_Ok == 1 )
  132.                   {
  133.                          switch(Checkbuf[2])
  134.                          {
  135.                           case 0x01://motor_reset();
  136.                                 break;
  137.                                 case 0x02://motor_set_pid_normal();     //开机默认模式
  138.                                 break;
  139.                                 case 0x03://motor_set_pid_para(1.5,0.1);
  140.                                 break;
  141.                                 case 0x04://if(pid_run == 1)
  142.                                           {
  143.                                                                          speed_one.data_8[0] = Checkbuf[4];
  144.                                                  speed_one.data_8[1] = Checkbuf[5];
  145.                                            speed_two.data_8[0] = Checkbuf[6];
  146.                                                                          speed_two.data_8[1] = Checkbuf[7];
  147.                                                                          //motor_set_pid_speed(speed_one.data_16,speed_two.data_16);
  148.                                                                         }
  149.                                 break;
  150.                                 case 0x05: //pid_run = 2;
  151.                                 break;
  152.                                 case 0x06: //if(pid_run == 2)
  153.                                                                         {
  154.                                                                          cur_one.data_8[0] = Checkbuf[4];
  155.                                                                          cur_one.data_8[1] = Checkbuf[5];
  156.                                                                          cur_two.data_8[0] = Checkbuf[6];
  157.                                                                          cur_two.data_8[1] = Checkbuf[7];
  158. //                                                                         set_cur[0]  =  cur_one.data_16;
  159. //                                                                         set_cur[1]  =  cur_two.data_16;
  160.                                                                          //motor_set_cur(cur_one.data_16,cur_two.data_16);
  161.                                                                         }
  162.                                  break;
  163.                           };
  164.                           RxBuf_Ok = 0;
  165.                  }
  166. //        Led_2_Control(-1);
  167. //        vTaskDelay(500);
  168.   }
  169. }  
复制代码
config里面是这样的
  1. #ifndef FREERTOS_CONFIG_H
  2. #define FREERTOS_CONFIG_H

  3. //#include "sys.h"
  4. //针对不同的编译器调用不同的stdint.h文件
  5. #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  6.     #include <stdint.h>
  7.     extern uint32_t SystemCoreClock;
  8. #endif

  9. //断言
  10. #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
  11. #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)

  12. /***************************************************************************************************************/
  13. /*                                        FreeRTOS基础配置配置选项                                              */
  14. /***************************************************************************************************************/
  15. #define configUSE_PREEMPTION                                          1                                                           //1使用抢占式内核,0使用协程
  16. #define configUSE_TIME_SLICING                                        1                                                                                                //1使能时间片调度(默认式使能的)
  17. #define configUSE_PORT_OPTIMISED_TASK_SELECTION        1               //1启用特殊方法来选择下一个要运行的任务
  18.                                                                                                                                                                                                                                                                                 //一般是硬件计算前导零指令,如果所使用的
  19.                                                                                                                                                                                                                                                                                 //MCU没有这些硬件指令的话此宏应该设置为0!
  20. #define configUSE_TICKLESS_IDLE                                        0                       //1启用低功耗tickless模式
  21. #define configUSE_QUEUE_SETS                                          1                       //为1时启用队列集
  22. #define configCPU_CLOCK_HZ                                                  (SystemCoreClock)       //CPU频率
  23. #define configTICK_RATE_HZ                                                        (1000)                  //时钟节拍频率,这里设置为1000,周期就是1ms
  24. #define configMAX_PRIORITIES                                                (32)                    //可使用的最大优先级
  25. #define configMINIMAL_STACK_SIZE                                ((unsigned short)130)   //空闲任务使用的堆栈大小
  26. #define configMAX_TASK_NAME_LEN                                        (16)                    //任务名字字符串长度

  27. #define configUSE_16_BIT_TICKS                                        0                       //系统节拍计数器变量数据类型,
  28.                                                                         //1表示为16位无符号整形,0表示为32位无符号整形
  29. #define configIDLE_SHOULD_YIELD                                        1                       //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
  30. #define configUSE_TASK_NOTIFICATIONS    1                       //为1时开启任务通知功能,默认开启
  31. #define configUSE_MUTEXES                                                                1                       //为1时使用互斥信号量
  32. #define configQUEUE_REGISTRY_SIZE                                8                       //不为0时表示启用队列记录,具体的值是可以
  33.                                                                         //记录的队列和信号量最大数目。
  34. #define configCHECK_FOR_STACK_OVERFLOW                        0                       //大于0时启用堆栈溢出检测功能,如果使用此功能
  35.                                                                         //用户必须提供一个栈溢出钩子函数,如果使用的话
  36.                                                                         //此值可以为1或者2,因为有两种栈溢出检测方法。
  37. #define configUSE_RECURSIVE_MUTEXES                                  1                       //为1时使用递归互斥信号量
  38. #define configUSE_MALLOC_FAILED_HOOK                          0                       //1使用内存申请失败钩子函数
  39. #define configUSE_APPLICATION_TASK_TAG                        0                       
  40. #define configUSE_COUNTING_SEMAPHORES                          1                       //为1时使用计数信号量

  41. /***************************************************************************************************************/
  42. /*                                FreeRTOS与内存申请有关配置选项                                                */
  43. /***************************************************************************************************************/
  44. #define configSUPPORT_DYNAMIC_ALLOCATION        1                       //支持动态内存申请
  45. #define configTOTAL_HEAP_SIZE                                        ((size_t)(90*1024))     //系统所有总的堆大小

  46. /***************************************************************************************************************/
  47. /*                                FreeRTOS与钩子函数有关的配置选项                                              */
  48. /***************************************************************************************************************/
  49. #define configUSE_IDLE_HOOK                                                0                       //1,使用空闲钩子;0,不使用
  50. #define configUSE_TICK_HOOK                                                0                       //1,使用时间片钩子;0,不使用

  51. /***************************************************************************************************************/
  52. /*                                FreeRTOS与运行时间和任务状态收集有关的配置选项                                 */
  53. /***************************************************************************************************************/
  54. #define configGENERATE_RUN_TIME_STATS                0                       //为1时启用运行时间统计功能
  55. #define configUSE_TRACE_FACILITY                                                        1                       //为1启用可视化跟踪调试
  56. #define configUSE_STATS_FORMATTING_FUNCTIONS        1                       //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
  57.                                                                         //prvWriteNameToBuffer(),vTaskList(),
  58.                                                                         //vTaskGetRunTimeStats()
  59.                                                                         
  60. /***************************************************************************************************************/
  61. /*                                FreeRTOS与协程有关的配置选项                                                  */
  62. /***************************************************************************************************************/
  63. #define configUSE_CO_ROUTINES                                                 0                       //为1时启用协程,启用协程以后必须添加文件croutine.c
  64. #define configMAX_CO_ROUTINE_PRIORITIES         ( 2 )                   //协程的有效优先级数目

  65. /***************************************************************************************************************/
  66. /*                                FreeRTOS与软件定时器有关的配置选项                                            */
  67. /***************************************************************************************************************/
  68. #define configUSE_TIMERS                                                        1                               //为1时启用软件定时器
  69. #define configTIMER_TASK_PRIORITY                        (configMAX_PRIORITIES-1)        //软件定时器优先级
  70. #define configTIMER_QUEUE_LENGTH                        5                               //软件定时器队列长度
  71. #define configTIMER_TASK_STACK_DEPTH              (configMINIMAL_STACK_SIZE*2)    //软件定时器任务堆栈大小

  72. /***************************************************************************************************************/
  73. /*                                FreeRTOS可选函数配置选项                                                      */
  74. /***************************************************************************************************************/
  75. #define INCLUDE_xTaskGetSchedulerState          1                       
  76. #define INCLUDE_vTaskPrioritySet                            1
  77. #define INCLUDE_uxTaskPriorityGet                                        1
  78. #define INCLUDE_vTaskDelete                                                                1
  79. #define INCLUDE_vTaskCleanUpResources                        1
  80. #define INCLUDE_vTaskSuspend                                                        1
  81. #define INCLUDE_vTaskDelayUntil                                                1
  82. #define INCLUDE_vTaskDelay                                                                1
  83. #define INCLUDE_eTaskGetState                                                        1
  84. #define INCLUDE_xTimerPendFunctionCall                1

  85. /***************************************************************************************************************/
  86. /*                                FreeRTOS与中断有关的配置选项                                                  */
  87. /***************************************************************************************************************/
  88. #ifdef __NVIC_PRIO_BITS
  89.         #define configPRIO_BITS                       __NVIC_PRIO_BITS
  90. #else
  91.         #define configPRIO_BITS                       4                  
  92. #endif

  93. #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                                15                      //中断最低优先级
  94. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5                       //系统可管理的最高中断优先级

  95. #define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
  96. #define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

  97. /***************************************************************************************************************/
  98. /*                                FreeRTOS与中断服务函数有关的配置选项                                          */
  99. /***************************************************************************************************************/
  100. #define xPortPendSVHandler         PendSV_Handler
  101. #define vPortSVCHandler           SVC_Handler

  102. #endif /* FREERTOS_CONFIG_H */

复制代码
堆栈我已经改到了很大了,哪位大神帮忙指点一下啊!!!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-4
在线时间
8 小时
 楼主| 发表于 2019-8-26 20:21:37 | 显示全部楼层
会不会是串口任务里面执行太快了?优先级也是最高的
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-8-28 09:12:42 | 显示全部楼层
代码中只有三个任务,没看出来第4个任务在哪?
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2019-8-28 09:22:51 | 显示全部楼层
内存不够?
回复

使用道具 举报

0

主题

28

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2018-7-25
在线时间
276 小时
发表于 2019-8-28 10:34:26 | 显示全部楼层
通过调试来找问题吧,先查看创建任务时的返回,确认任务是否创建成功,再继续跟任务不调度时是在执行哪些代码。不过有RTOS分析工具会更好一些。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 03:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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