ANO匿名飞控STM32代码解读(一)任务调度——Ano_Scheduler.c

我所学习的代码是匿名飞控使用STM32芯片ANO_PioneerPro-20190825的版本。
匿名飞控的整体代码是跑裸机的,任务调度是用STM32F4芯片中的系统时钟计时,做了一个任务调度系统,举个例子,大概就是有四个任务,任务有运行顺序,每个任务有一个运行周期。每个任务分担不同,分别有姿态检测、电机控制等任务。任务一每1ms运行一次、任务二10ms运行一次、任务三1000ms运行一次。在while死循环中不停执行这些任务并且判断这些任务的执行时间间隔,如果达到最小间隔,则再次执行。
初学者我的惨痛经历让我明白明白一些语法分别涉及到数组、指针、结构体、结构体数组等,基本语法、stm32库函数、关键字等等在看程序前需要掌握。并且代码中使用了大量的标志位。匿名的代码还是比较简洁易懂的(除了变量命名,有些真是看不懂啊,alt和att后来才懂)。
我把我添加的注释写到了下方的代码中

int main(void)
{
   
	flag.start_ok = All_Init();		//进行所有设备的初始化,并将初始化结果保存
	Scheduler_Setup();				//调度器初始化,系统为裸奔,这里人工做了一个时分调度器
	while(1)
	{
   
		Scheduler_Run();			//运行任务调度器,所有系统功能,除了中断服务函数,都在任务调度器内完成
	}
}

All_Init()函数进行了时钟、外设等的初始化。

Scheduler_Setup()
认识这个函数前需要先看头文件中的一个结构体

typedef struct
{
   
void(*task_func)(void);   //函数指针
uint16_t rate_hz;
uint16_t interval_ticks;
uint32_t last_run;
}sched_task_t;

这个结构体就是用来储存每个任务的任务函数、执行频率、间隔时间、最后一次运行时刻的。
那么由这个结构体又定义了一个结构体数组

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,  
  • 7
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值