时间片改为FreeRTOS

时间片改为FreeRTOS

1.文件移植

  将FreeRTOS文件夹复制到目标工程文件夹

FreeRTOSConfig.h文件复制

2.工程内添加文件

heap-4.c路径: \FreeRTOS\port\MemMang

 3.工程内添加路径

  1. 错误处理

(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



总结

核心就是缺啥补啥

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值