中级会员
- 积分
- 378
- 金钱
- 378
- 注册时间
- 2017-11-29
- 在线时间
- 135 小时
|
1金钱
左哥:我按照第13.2讲的视频手把手跟着你的讲解在我的F1开发板(不是正点的板子)写了这个函数的实验“void vTaskGetRunTimeStats( char *pcWriteBuffer )”;是手把手跟你做的。Main函数如下所示。串口显示出了各个任务的执行时间计数以及所占CPU的百分比;但是板子上的LED1(相当于正点板子的LED0)一直常亮,不闪烁;LED2(相当于正点的LED1)我看到应该是按照1s 在闪烁。我的问题是LED1为什么不按照程序要求的每1s闪烁呢?难道是这个任务没有得到执行?
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "FreeRTOS.h"
#include "task.h"
/************************************************
ALIENTEK 战舰STM32F103开发板 FreeRTOS实验2-1
FreeRTOS任务状态与信息查询实验13.1视频-库函数版本
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
//任务优先级
#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 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
//任务优先级
#define RUNTIMESTATS_TASK_PRIO 3
//任务堆栈大小
#define RUNTIMESTATS_STK_SIZE 256
//任务句柄
TaskHandle_t RunTimeStats_Handler;
//任务函数
void RunTimeStats_task(void *pvParameters);
char InfoBuffer[1000];
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
KEY_Init(); //初始化KEY
//创建开始任务
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(); //开启任务调度
}
//开始任务任务函数
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);
//创建QUERY任务
xTaskCreate((TaskFunction_t )RunTimeStats_task,
(const char* )"RunTimeStats_task",
(uint16_t )RUNTIMESTATS_STK_SIZE,
(void* )NULL,
(UBaseType_t )RUNTIMESTATS_TASK_PRIO,
(TaskHandle_t* )&RunTimeStats_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//LED1任务函数
void led1_task(void *pvParameters)
{
while(1)
{
LED1=!LED1;
vTaskDelay(1000);
}
}
//RunTimeStats任务函数
void RunTimeStats_task(void *pvParameters)
{
u8 key,i;
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
vTaskGetRunTimeStats(InfoBuffer);
printf("%s\r\n",InfoBuffer);
}
i++;
if(i==100)
{
i=0;
LED2=!LED2;
}
vTaskDelay(10);
}
}
按WKUP串口显示
|
|