论坛元老
- 积分
- 7258
- 金钱
- 7258
- 注册时间
- 2015-6-7
- 在线时间
- 446 小时
|
100金钱
本帖最后由 wjx1203020119 于 2018-6-10 17:20 编辑
使用FreeRTOS创建了4个任务,但是始终只有前两个任务执行,如果注释掉第二个任务后,就会第一个和第三个执行,注释掉第一个任务,只有第二个和第三个任务执行,不知道是哪里有问题,还请个位高手指点一下,谢谢!
创建任务原码:static void TESK_LED1(void const *argument);
static void TESK_LED2(void const *argument);
static void TESK_LED3(void const *argument);
static void TESK_LED4(void const *argument);
static void SystemClock_Config(void);
static void Error_Handler(void);
void Start_Task( void * pvParameters );
/* Private functions ---------------------------------------------------------*/
//定义开始任务堆栈大小和任务优先级
#define START_TASK_SIZE 120
#define START_TASK_PRIO 1
//定义LED1任务堆栈大小和任务优先级
#define LED1_TASK_SIZE 120
#define LED1_TASK_PRIO 4
//定义LED2任务堆栈大小和任务优先级
#define LED2_TASK_SIZE 120
#define LED2_TASK_PRIO 5
//定义LED3任务堆栈大小和任务优先级
#define LED3_TASK_SIZE 120
#define LED3_TASK_PRIO 2
//定义LED4任务堆栈大小和任务优先级
#define LED4_TASK_SIZE 120
#define LED4_TASK_PRIO 3
/**
* @brief Main program
* @param None
* @retval None
*/
TaskHandle_t START_TASK_Handel_t;//任务句柄
TaskHandle_t LED1_TASK_Handel_t;
TaskHandle_t LED2_TASK_Handel_t;
TaskHandle_t LED3_TASK_Handel_t;
TaskHandle_t LED4_TASK_Handel_t;
int main(void)
{
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, instruction and Data caches
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Global MSP (MCU Support Package) initialization
*/
HAL_Init();
/* Configure the system clock to 180 MHz */
SystemClock_Config();
/* Configure LED1 and LED3 */
BSP_LED_Init(LED1);
BSP_LED_Init(LED2);
BSP_LED_Init(LED3);
BSP_LED_Init(LED4);
//创建开始任务
xTaskCreate((TaskFunction_t) Start_Task,
(char* ) "start_tesk",
(uint16_t ) START_TASK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t *) &START_TASK_Handel_t );
//开启任务调度器
vTaskStartScheduler();
}
void Start_Task( void * pvParameters )
{
taskENTER_CRITICAL(); //进入临界区
//创建TESK_LED1任务
xTaskCreate((TaskFunction_t) TESK_LED1,
(char* ) "LED1_tesk",
(uint16_t ) LED1_TASK_SIZE,
(void * ) NULL,
(UBaseType_t ) LED1_TASK_PRIO,
(TaskHandle_t *) &LED1_TASK_Handel_t );
//创建TESK_LED2任务
xTaskCreate((TaskFunction_t) TESK_LED2,
(char* ) "LED2_tesk",
(uint16_t ) LED2_TASK_SIZE,
(void * ) NULL,
(UBaseType_t ) LED2_TASK_PRIO,
(TaskHandle_t *) &LED2_TASK_Handel_t );
//创建TESK_LED3任务
xTaskCreate((TaskFunction_t) TESK_LED3,
(char* ) "LED3_tesk",
(uint16_t ) LED3_TASK_SIZE,
(void * ) NULL,
(UBaseType_t ) LED3_TASK_PRIO,
(TaskHandle_t *) &LED3_TASK_Handel_t );
//创建TESK_LED4任务
xTaskCreate((TaskFunction_t) TESK_LED4,
(char* ) "LED4_tesk",
(uint16_t ) LED4_TASK_SIZE,
(void * ) NULL,
(UBaseType_t ) LED4_TASK_PRIO,
(TaskHandle_t *) &LED4_TASK_Handel_t );
vTaskDelete(START_TASK_Handel_t);//执行1次后删除开始任务
taskEXIT_CRITICAL();//退出临界区
}
static void TESK_LED1(void const *argument)
{
while(1)
{
BSP_LED_On(LED1);
vTaskDelay(1000);
BSP_LED_Off(LED1);
vTaskDelay(1000);
}
}
static void TESK_LED2(void const *argument)
{
while(1)
{
BSP_LED_On(LED2);
vTaskDelay(200);
BSP_LED_Off(LED2);
vTaskDelay(800);
}
}
static void TESK_LED3(void const *argument)
{
while(1)
{
BSP_LED_On(LED3);
vTaskDelay(50);
BSP_LED_Off(LED3);
vTaskDelay(50);
}
}
static void TESK_LED4(void const *argument)
{
while(1)
{
BSP_LED_On(LED4);
vTaskDelay(100);
BSP_LED_Off(LED4);
vTaskDelay(800);
}
}
|
最佳答案
查看完整内容[请看2#楼]
非常感谢各位的热心解答,问题已解决,是因为我给系统分配的内存不够用了,增加内存就可以了;
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 4 * 1024 ) ) /* 2 Kbytes */
更改为:以下大小就ok啦;
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) /* 2 Kbytes */
|