转载:Pixhawk源码笔记十:代码调度,使之定时运行

转自:新浪长沙@WalkAnt

第十一部分 调用代码,使之定时运行

英文参考:http://dev.ardupilot.com/wiki/code-overview-scheduling-your-new-code-to-run-intermittently/

本节源自:http://liung.github.io/blog/apm/2014-09-05-APM-ArduCopter规划新代码使之按一定频率运行.html


1、用代码调度器(scheduler)运行你的代码

在给定时间间隔内来运行你的代码的最灵活的方式就是使用调度器。这可以通过将你的函数添加到文件ArduCopter.pde中的scheduler_tasks数组来完成。需要表明的是:实际上该文件中有两个任务列表,上面的任务列表是针对高频CPUs(如Pixhawk),对应的调度频率是400Hz,下面是针对低频CPUs(如APM2),对应的调度频率是100Hz。

添加一个任务是相当的简单,你只要在列表添加新的一行代码就可以了(列表中位置越靠前意味着拥有更高的级别)。任务项中的第一列代表了函数名,第二列是以2.5ms为单位的数字(或者APM2中以10ms为单位)。所以,如果你想要你的函数执行频率为400Hz,那么该列就需要填写为“1”,如果想要50Hz,那么就需要改为“8”。任务项的最后一列代表该函数预计运行花费的微秒(百万分之一秒)时间。这可以帮助调度器来预估在下一个主循环开始之前有否有足够的时间来运行你的函数。

static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = {

{ update_GPS,            2,     900 },

{ update_nav_mode,       1,     400 },

{ medium_loop,           2,     700 },

{ update_altitude,      10,    1000 },

{ fifty_hz_loop,         2,     950 },

{ run_nav_updates,      10,     800 },

{ slow_loop,            10,     500 },

{ gcs_check_input,              2,     700 },

{ gcs_send_heartbeat,  100,     700 },

{ gcs_data_stream_send,  2,    1500 },

{ gcs_send_deferred,     2,    1200 },

{ compass_accumulate,    2,     700 },

{ barometer_accumulate,  2,     900 },

{ super_slow_loop,     100,    1100 },

    { my_new_function,      10,     200 },

{ perf_update,        1000,     500 }

};

2、作为循环的一部分运行你的代码

为了代替在代码调度器中加入一个新的函数入口,你还可以在现有的任何时间循环事件中添加你的函数。除了在fast-loop循环中添加外,这种方法对比起上面的代码调度器方法并没有什么实质性好处。但当你的代码添加到fast-loop循环中时,就意味着它将以最高的优先级别来执行(它几乎能100%达到所确保的400hz运行速度)。

所以举个例子,如果你想让你的代码运行频率为10hz,那么你就要将它添加到ArduCopter.pde文件的ten_hz_logging_loop()函数声明中。

// ten_hz_logging_loop

// should be run at 10hz

static void ten_hz_logging_loop()

{

if (g.log_bitmask & MASK_LOG_ATTITUDE_MED) {

Log_Write_Attitude();

}

if (g.log_bitmask & MASK_LOG_RCIN) {

DataFlash.Log_Write_RCIN();

}

if (g.log_bitmask & MASK_LOG_RCOUT) {

DataFlash.Log_Write_RCOUT();

}

if ((g.log_bitmask & MASK_LOG_NTUN) && mode_requires_GPS(control_mode)) {

Log_Write_Nav_Tuning();

}

        // your new function call here

        my_new_function();

}

时间: 2024-12-29 07:14:07

转载:Pixhawk源码笔记十:代码调度,使之定时运行的相关文章

转载:Pixhawk源码笔记二:APM线程

  转自:新浪@WalkAnt Pixhawk源码笔记一:APM代码基本结构,参见: http://blog.sina.com.cn/s/blog_402c071e0102v59r.html 这里,我们对 APM 线程进行讲解.如有问题,可以交流[email protected].新浪@WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢. 第三部分 APM线程 详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-threa

转载:Pixhawk源码笔记四:学习RC Input and Output

转自:新浪@WalkAnt 第五部分 学习RC Input and Output 参考:http://dev.ardupilot.com/wiki/learning-ardupilot-rc-input-output/ RC Input,也就是遥控输入,用于控制飞行方向.改变飞行模式.控制摄像头等外围装置.ArduPilot支持集中不同RC input(取决于具体的硬件飞控板): 1. PPMSum – on PX4, Pixhawk, Linux and APM2 2. SBUS – on P

转载:Pixhawk源码笔记三:串行接口UART和Console

转自:新浪@WalkAnt 第四部分 串行接口UART和Console 详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-uarts-and-the-console/ UART很重要,用于调试输出,数传.GPS模块等. 1.5个UART 目前共定义了5个UART,他们的用途分别是: uartA – 串行终端,通常是Micro USB接口,运行MAVLink协议. uartB – GPS1模块. uartC – 主数传接口,也就是Pixha

转载:Pixhawk源码笔记一:APM代码基本结构

转自 新浪微博@WalkAnt 基础知识 详细参考:http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/ 第一部分:介绍 详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/ ArduPilot 代码分为5个主要部分,基本结构分类如下: vehicle directories AP_HAL libraries tools directories

转载:Pixhawk源码笔记十一:增加新的MAVLink消息

转自:新浪长沙@WalkAnt 第十二部分 增加新的MAVLink消息 英文参考:http://dev.ardupilot.com/wiki/code-overview-adding-a-new-mavlink-message/ 本节源自:http://liung.github.io/blog/apm/2014-09-05-APM-增加新的MAVLink通讯协议消息.html MavLink协议:https://pixhawk.ethz.ch/mavlink/ 地面站之间的数据和指令通信都是通过

转载:Pixhawk源码笔记八:添加新的参数

转载:新浪@WalkAnt 第九部分 添加新的参数 英文参考:http://dev.ardupilot.com/wiki/code-overview-adding-a-new-parameter/ 本节源自:http://liung.github.io/blog/apm/2014-09-02-APM-添加新的参数.html 1 在主执行代码中添加参数         第一步:         Step #1: 在文件Parameters.h参数类中的枚举变量(enum)的合适位置,像下面代码块最

转载:Pixhawk源码笔记五:存储与EEPROM管理

转自:新浪@WalkAnt 第六部分 存储与EEPROM管理 详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-storage-and-eeprom-management/ 用户参数.航点.集结点.地图数据以及其他有用的信息需要存储.ArduPilot提供4个基本存储接口: 1.AP_HAL::Storage对象:hal.storage: 2.StorageManager库,是hal.storage更高级别的封装: 3.DataFlash

转载:Pixhawk源码笔记九:添加新的飞行模式

转自:新浪长沙@WalkAnt 第十部分 添加新的飞行模式 英文参考:http://dev.ardupilot.com/wiki/apmcopter-adding-a-new-flight-mode/ 本节源自:http://liung.github.io/blog/apm/2014-09-05-APM-ArduCopter添加新的飞行模式.html 这部分将涵盖一些怎样创建一个新的高级别的飞行模式的基本操作步骤(类似于自稳,悬停等),这些新模式处于“the onion”(洋葱头工程)中的高级别

转载:Pixhawk源码笔记七:姿态控制预览

转自:新浪@WalkAnt 第八部分 姿态控制预览 英文参考:http://dev.ardupilot.com/wiki/apmcopter-programming-attitude-control-2/ 本节源自:http://liung.github.io/blog/apm/2014-08-31-APM-ArduCopter姿态控制概览.html 手动飞行模式,诸如自稳模式(Stabilize Mode).特技模式(Acro Mode).飘逸模式(Drift Mode),其程序结构如下图: