新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2022-4-6
- 在线时间
- 3 小时
|
1金钱
问题:我下面的代码中任务1优先级比任务2优先级高,可我实验现象是LED0与LED1的时候他们是同时亮与灭。不应该是任务1中的LED0先亮5秒再灭一秒才到LED1亮5秒再灭一秒吗?C语言不是顺序执行吗?我怎么感觉任务1与任务2同时执行?
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
void start_task( void * pvParameters );//任务函数
#define START_TASK_PRIO 1
#define START_STK_SIZE 120
TaskHandle_t StartTask_Handler;
void start_task1( void * pvParameters );
#define START_TASK1_PRIO 3
#define START_STK1_SIZE 120
TaskHandle_t StartTask1_Handler;
void start_task2( void * pvParameters );
#define START_TASK2_PRIO 2
#define START_STK2_SIZE 120
TaskHandle_t StartTask2_Handler;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
xTaskCreate( (TaskFunction_t ) start_task, //任务函数
( char* ) "start_task", //任务名称
( uint16_t ) START_STK_SIZE, //任务堆栈大小
(void * ) NULL, //传递给任务函数的参数
(UBaseType_t ) START_TASK_PRIO, //任务优先级
(TaskHandle_t* ) &StartTask_Handler );//任务句柄
vTaskStartScheduler(); //开启任务调度 器
}
void start_task( void * pvParameters )
{
//创建任务1
xTaskCreate( (TaskFunction_t ) start_task1,
( char* ) "start_task1",
( uint16_t ) START_STK1_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK1_PRIO,
(TaskHandle_t* ) &StartTask1_Handler );//任务句柄
//创建任务2
xTaskCreate( (TaskFunction_t ) start_task2,
( char* ) "start_task2",
( uint16_t ) START_STK2_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK2_PRIO,
(TaskHandle_t* ) &StartTask2_Handler );//任务句柄
vTaskDelete(StartTask_Handler);//删除任务函数(内为任务句柄)
}
void start_task1( void * pvParameters )
{
u8 p=0;
while(1)
{
LED0=0;
vTaskDelay(5000);
LED0=1;
vTaskDelay(1000);
p++;
printf("task1 run %d \r\n",p);
}
}
void start_task2( void * pvParameters )
{
u8 i=0;
while(1)
{
LED1=0;
vTaskDelay(5000);
LED1=1;
vTaskDelay(1000);
i++;
printf("task2 run %d \r\n",i);
}
}
|
最佳答案
查看完整内容[请看2#楼]
在vTaskDelay里会进行一次任务调度 会切换到已经就绪的任务
如果像你想得那样 你的TASK1是个while循环 不找个机会切出来 任务还怎么切换
|