【MM32F5270开发板试用】SysTick+Scheduler轮询
上一篇文章:【MM32F5270开发板试用】一、依靠SPI_SD,移植FatFs文件系统
本次所有代码按照以前习惯全部开源:我的Github地址是:https://github.com/kings669/M...
由于开发需要,人工加一个轮询系统,方便之后的开发。
一、SysTick配置
static uint64_t SysRunTimeMs = 0;
static uint8_t fac_us = 0;
static uint32_t fac_ms = 0;
void SysTick_Init(void)
{
uint32_t reload = 0;
SysTick->CTRL &= (uint32_t)0xFFFFFFFB;
fac_us = CLOCK_SYS_FREQ / 8000000U;
fac_ms = CLOCK_SYS_FREQ / 8000U;
reload = CLOCK_SYSTICK_FREQ/1000;
reload--;
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
SysTick->LOAD = reload;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
SysRunTimeMs++;
}
uint32_t GetSysRunTimeMs(void)
{
return SysRunTimeMs;
}
顺便写一个延时函数
void delay_us(uint16_t nus)
{
uint32_t ticks = 0;
uint32_t told = 0;
uint32_t tnow = 0;
uint32_t tcnt = 0;
uint32_t reload = 0;
reload = SysTick->LOAD;
ticks = nus * fac_us;
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
void delay_ms(uint16_t nms)
{
uint32_t ticks = 0;
uint32_t told = 0;
uint32_t tnow = 0;
uint32_t tcnt = 0;
uint32_t reload = 0;
reload = SysTick->LOAD;
ticks = nms * fac_ms;
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
二、轮询
轮询这里直接使用了匿名飞控的轮询。
#include "Scheduler.h"
static void Loop_1000Hz(void)
{
}
static void Loop_500Hz(void) //2ms
{
}
static void Loop_200Hz(void) //5ms
{
}
static void Loop_100Hz(void) //10ms
{
}
static void Loop_50Hz(void) //20ms
{
}
static void Loop_20Hz(void) //50ms
{
}
static void Loop_2Hz(void) //500ms
{
printf("Test 2Hz\r\n");
}
static sched_task_t sched_tasks[] =
{
{Loop_1000Hz, 1000, 0, 0},
{Loop_500Hz, 500, 0, 0},
{Loop_200Hz, 200, 0, 0},
{Loop_100Hz, 100, 0, 0},
{Loop_50Hz, 50, 0, 0},
{Loop_20Hz, 20, 0, 0},
{Loop_2Hz, 2, 0, 0},
};
#define TASK_NUM (sizeof(sched_tasks) / sizeof(sched_task_t))
void Scheduler_Setup(void)
{
uint8_t index = 0;
for (index = 0; index < TASK_NUM; index++)
{
sched_tasks[index].interval_ticks = TICK_PER_SECOND / sched_tasks[index].rate_hz;
if (sched_tasks[index].interval_ticks < 1)
{
sched_tasks[index].interval_ticks = 1;
}
}
}
void Scheduler_Run(void)
{
uint8_t index = 0;
for (index = 0; index < TASK_NUM; index++)
{
uint32_t tnow = GetSysRunTimeMs();
if (tnow - sched_tasks[index].last_run >= sched_tasks[index].interval_ticks)
{
sched_tasks[index].last_run = tnow;
sched_tasks[index].task_func();
}
}
}
/******************* (C) COPYRIGHT 2014 ANO TECH *****END OF FILE************/
三、验证效果
可以看出效果还是很不错的
总结
要问我为什么不用RTOS,我已经尝试过,没有成功就作罢了。比如再移植RT-Thread的时候,有个文件不支持ARM6的编译器。移植FreeRTOS的时候,有几个地方一直报错,网上也没有相关的资料。对这个架构也不熟悉,为了项目进场,尝试一番过后,选中最简单的轮询。希望MindSDK可以快速跟进💪