QP编码标准-对AN_QL_Coding_Standard文档的总结(部分)

总的规则:
    1、为了提高便携性,本标准建议统一使用了Unix™尾行约定,只有一个LF 字符(的0x0A)结束的每一行。在DOS / Windows的尾行约定以CR,LF 不推荐字符对符(0x0D,0x0A的)终止每行,因为它会导致编译 在Unix上的问题™般的系统,如Linux™。
    2、所有的源代码都只使用小写字母为文件或目录命名。这个限制 促进可移植性,因为它消除了在名称不一致的可能性。 例如,在Unix™样系统可能不正确地包括文件“qevent.h”时,文件名是 实际上是“QEvent.h”。

层次:
    在函数名后括号面前有没有空间。一个空格应该在”,“后和在实参前。

Indentation(缩进):
    所有的缩进都必须正好4个空格以指示范围。
    格式化如下:
        <declarator | control statement> {// {之前有一个空格
            <statement>;
          . . .

        }

    上边的格式应用的地方:
         function declarator
 structure/class declarator
 enumeration
 structure/array initializer
 control statement (if, while, for, switch, case, do)
 enumeration
 structure/array initializer
 control statement (if, while, for, switch, case, do)
 structure/array initializer
 control statement (if, while, for, switch, case, do)
 control statement (if, while, for, switch, case, do)

    若<declarator | control statement>一行写不下,应该按照如下格式:
        <declarator | control statement ...>
            <... declarator | control statement ...>
            <... declarator | control statement>
         {
              <statement>;
         },如:
if (!decodeData(&s, &dataType,/*,分隔符作为一行的结尾*/

                &format, &version)

&& format != 2 /* expecting only format 2 */

&& version != 1) /* expecting only version 1 */
{
       log("data corrupt");
}

    好处是消除疑虑,方便阅读;易于添加移除代码。

注释:
    注释的分类,总的分成三类:
    1、为主要软件组件拟定的高层注释,比如模块,类和外部的API。-》顶层的意见应该总是在注释的对象之前。
    2、简单地说,解释执行操作的算法细节的精细粒度的注释。-》代码与注释应易于区分。
    3、附在注释形式的代码中的引用和注释。-》应在模块的末尾,为了展示下一节模块的布局中。
模块:
    结构如下:
        1、头注释块
        2、#include说明
        3、公共部分规范
        4、包部分的规格
        5、当地部分规格
        6、注意(note)

    1、头注释块
        /*****************************************************************************
* Product: . .
* Version: . .
* Updated: Dec 17 2004
*
* Copyright (C) 2002-2004 Quantum Leaps. All rights reserved.
*
* <licensing terms> (if any)
*
* <Company contact information>
*****************************************************************************/
    2、包含头文件
         #include "rtk.h" /* Real-Time Kernel */
         #include "qassert.h" /* embedded-systems-friendly assertions */

    3、定义公共或者全局的变量应该在模块的顶部出现
        /* Public-scope objects ---------------------------------------------------*/
        QActive *UI_Mgr; /* pointer to the User Interface Manager active object */
        
    4、公共(全局)变量应遵循所有包范围的变量:
          /* Package-scope objects ---------------------------------------------------*/
QEvent const QEP_stdEvt[] = {
    { Q_EMPTY_SIG, 0},
    { Q_INIT_SIG, 0},
    { Q_ENTRY_SIG, 0},
    { Q_EXIT_SIG, 0}
};
    5、包范围变量应遵循由当地(模块范围的)声明和局部变量(模块的范围)。所有本地范围变量应该定义静态的。
        /* Local-scope objects -----------------------------------------------------*/
        static uint32_t l_svMask; /* Space Vehicle mask indicating allocated SVs */

命名:
    命名约定:
        1、标识符不应超过31个字符。
        2、类型名称(typedef、struct、class)应该以大写字母开头。可选的,类型名称可以用模块标识符作为前缀。如:typedef uint16_t QSignal,classQActive。
        3、普通的C函数和C ++类的成员函数开始用小写字母。
        4、在C语言编写的类成员函数(见第6章)以类名和一个 下划线为 前缀 ,所以每一条规则必须以大写字母开头。 (QActive_start())。 除了
明确区分成员函数,这个规则最大限度地减少连接时间命名冲突的 功能(包括第三方库函数)。
        5、全局函数是以模块名和一个下划线为前缀(例如:QF_start())。包范围函数,只有从密切相关的组的源文件,所述包的可见的,被附加后缀以下划线(QF_add_())。
        6、普通变量开头用小写字母(foo)。
        7、全局变量以模块名和下划线为前缀(QK_readySet)。
        8、本地变量(只在一个模块内可见)应该用"l_"开始,比如:l_bitmask。在本地的范围内所有的本地变量应该被static声明。
        9、常量(数字宏和枚举)应该处于大写字母下并用下滑线连接每个词或缩写(FOO_BAR)。全局常量应该以模块名或标识符为前缀(Q_USER_SIG)
        10、所有组成标识符的其他部分形成的多个单词应该在字边界用大写字母构成,像:fooBarTar,而不是foo_bar_tar。
        11、一般来说,更加广阔的范围内更具描述性的名称应该是。对于一个非常有限的范围内,它 推荐使用单字母标识符。如: o i, j, k, m, n: 用于像循环计数的整形; o p, q, r, s, t, u, v, w:用于指针或浮点数。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
qp官网下载qpc,移植到stm32f103单片机,在正点原子战舰V3开发板上实验成功 qp搭建步骤重要提示: #define RED_QUEUE_LEN 3 #define BLUE_QUEUE_LEN 3 #define TACKER_EVENT_POOL_LEN (RED_QUEUE_LEN + BLUE_QUEUE_LEN) static QEvt const * l_redQueueSto[RED_QUEUE_LEN]; //事件队列 static QEvt const * l_blueQueueSto[BLUE_QUEUE_LEN]; //事件队列 static LedEvt LedEvtPoolSto[TACKER_EVENT_POOL_LEN]; //事件池 static QSubscrList SubSrcSto[MAX_PUB_SIG]; //订阅列表 typedef struct LedEvtTag LedEvt; //定义事件结构 struct LedEvtTag{ QEvt super_; uint16_t uiParaH; uint16_t uiParaL; }; //定义信号枚举 enum LedSignals{ START_SIG = Q_USER_SIG, KEY0_SIG, KEY1_SIG, KEY2_SIG, KEYUP_SIG, ALL_OFF_SIG, ONLY_BULE_SIG, ONLY_RED_SIG, ALL_ON_SIG, MAX_PUB_SIG }; void PublishLedEvt(uint16_t uiSig, uint16_t uiParaH, uint16_t uiParaL) //发布事件函数 { LedEvt* peTacker; peTacker = Q_NEW(LedEvt, uiSig); peTacker->uiParaH = uiParaH; peTacker->uiParaL = uiParaL; QF_publish_((QEvt*)peTacker); } QF_init(); //时间事件列表、活动对象查找表、优先级集合 QF_psInit(SubSrcSto, Q_DIM(SubSrcSto)); //初始化事件池 QF_poolInit(LedEvtPoolSto,sizeof(LedEvtPoolSto),sizeof(LedEvtPoolSto[0])); RedLed_Start(uiPrio++, l_redQueueSto, Q_DIM(l_redQueueSto), 0, 0); //建立活动对象 BlueLed_Start(uiPrio++, l_blueQueueSto, Q_DIM(l_blueQueueSto), 0, 0); /////////////////////////////////////////////////// typedef struct RedActiveTag RedActive; //构建一个活动对象活动类型 struct RedActiveTag{ QActive super_; volatile uint16_t RedLedStateNow; uint16_t a; uint16_t b; }; extern RedActive RedLed; RedActive RedLed; void RedLed_Start(uint_fast8_t prio, QEvt const *qSto[], uint_fast16_t qLen, void *stkSto, uint_fast16_t stkSize) { RedLed_Ctor(&RedLed;); QActive_start_((QActive*)&RedLed;, prio, qSto, qLen, stkSto, stkSize, (QEvt const *)0); //创立活动对象的线程并提醒 QF 开始管理活动对象 } void RedLed_Ctor(RedActive* me) { QActive_ctor(&me;->super_, (QStateHandler)RedLed_Initial); //初始化状态机基础类(成员 super) me->RedLedStateNow = 0; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值