我所学习的代码是匿名飞控使用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,