时间片改为FreeRTOS
1.文件移植
将FreeRTOS文件夹复制到目标工程文件夹
FreeRTOSConfig.h文件复制
2.工程内添加文件
heap-4.c路径: \FreeRTOS\port\MemMang
3.工程内添加路径
-
错误处理
(1)将重复定义的注释(注释掉原本的)
(2) 添加#include "FreeRTOS.h" #include "task.h" 和下列函数
struct{
RCC_ClocksTypeDef RCC_Clocks;
uint32_t MemoryFree;
uint8_t MemoryRatio;
uint32_t TaskCount;
uint8_t CPU_Ratio;
}SystemRTOS;
/*空闲任务钩子函数*/
void vApplicationIdleHook(void){
/*统计CPU使用率*/
uint32_t ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); //获取CPU时间
SystemRTOS.MemoryFree = xPortGetFreeHeapSize(); //获取当前可用内存
SystemRTOS.MemoryRatio = (uint8_t)(((float)(configTOTAL_HEAP_SIZE - SystemRTOS.MemoryFree)/configTOTAL_HEAP_SIZE)*100.00F); //计算内存使用率
SystemRTOS.TaskCount = uxTaskGetNumberOfTasks(); //获取任务数量
ulTotalTime /= 100UL;
SystemRTOS.CPU_Ratio = 100 - vTaskGetRunTime(NULL) / ulTotalTime; //计算CPU使用率
}
/*内存溢出钩子函数*/
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ){
printf("任务:%s 内存溢出\r\n",pcTaskName);
}
/*异常输出函数*/
void ErrorOutput(char*name,uint32_t line,char*details){
printf("Error:%s,%d\r\n%s\r\n",name,line,details);
}
(3).补全缺失的文件到工程中
(4).编译无错误
4.重新编写main函数
#include "sys_init.h"
#include "timer.h"
#include "FreeRTOS.h"
#include "task.h"
#define SYS_TEST_ENABLE 0 //系统信息输出
struct{
RCC_ClocksTypeDef RCC_Clocks;
uint32_t MemoryFree;
uint8_t MemoryRatio;
uint32_t TaskCount;
uint8_t CPU_Ratio;
}SystemRTOS;
void MainTask(void);
static void CPU_RunTimeCount();
int main(void)
{
/*中断优先级分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/*设置中断向量表指向*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
/*获取系统时钟*/
RCC_GetClocksFreq(&SystemRTOS.RCC_Clocks);
/*初始化串口调试*/
//USART_DBG_INIT();
/*初始化CPU时间*/
Timer7_Init(50,(TIMER_7_RCC_CLOCK/1000000),CPU_RunTimeCount);
/*关闭JTAG*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能复用时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //更改引脚映射 禁用JTAG 启用SWD
//GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE); //启用PD0和PD1端口作为GPIO
PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/
RCC_LSEConfig( RCC_LSE_OFF ); /* 关闭外部低速时钟,PC14+PC15可以用作普通IO*/
BKP_TamperPinCmd(DISABLE); //关闭侵入检测
/*创建第一任务*/
xTaskCreate((TaskFunction_t )MainTask, /* 任务入口函数 */
(const char* )"MainTask", /* 任务名字 */
(uint16_t )128, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )1, /* 任务的优先级 */
(TaskHandle_t* )NULL); /* 任务控制块指针 */
/*初始化看门狗*/
IWDG_500ms_Init();
/*启动任务,开启调度*/
vTaskStartScheduler();
while(1);
}
/*任务初始化任务*/
void MainTask(void){
vTaskDelay(500);
/*进入临界段*/
taskENTER_CRITICAL();
/*退出临界段*/
taskEXIT_CRITICAL();
#if (SYS_TEST_ENABLE == 1)
char *CPU_RunInfo = pvPortMalloc(1024);
while(1){
memset(CPU_RunInfo,0,1024); //信息缓冲区清零
vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息
printf("---------------------------------------------\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n");
memset(CPU_RunInfo,0,1024); //信息缓冲区清零
vTaskGetRunTimeStats((char *)&CPU_RunInfo);
printf("任务名 运行计数 利用率\r\n");
printf("%s", CPU_RunInfo);
printf("---------------------------------------------\r\n\n");
vTaskDelay(1000);
}
#endif
/*删除任务创建任务*/
vTaskDelete(NULL);
}
/*空闲任务钩子函数*/
void vApplicationIdleHook(void){
/*统计CPU使用率*/
uint32_t ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); //获取CPU时间
SystemRTOS.MemoryFree = xPortGetFreeHeapSize(); //获取当前可用内存
SystemRTOS.MemoryRatio = (uint8_t)(((float)(configTOTAL_HEAP_SIZE - SystemRTOS.MemoryFree)/configTOTAL_HEAP_SIZE)*100.00F); //计算内存使用率
SystemRTOS.TaskCount = uxTaskGetNumberOfTasks(); //获取任务数量
ulTotalTime /= 100UL;
SystemRTOS.CPU_Ratio = 100 - vTaskGetRunTime(NULL) / ulTotalTime; //计算CPU使用率
}
/*内存溢出钩子函数*/
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ){
printf("任务:%s 内存溢出\r\n",pcTaskName);
}
/*异常输出函数*/
void ErrorOutput(char*name,uint32_t line,char*details){
printf("Error:%s,%d\r\n%s\r\n",name,line,details);
}
/* 用于统计运行时间 */
volatile uint32_t CPU_RunTime = 0UL;
static void CPU_RunTimeCount(void){CPU_RunTime++;}
///
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
总结
核心就是缺啥补啥