FreeRTOS使用心得

FreeRTOS编码标准及风格

一个例外情况是头文件stdint.h。在文件夹FreeRTOS/Source/includest下包含一个dint.readme的文件,如果你的编译器
不提供stdint类型定义,可以将stdint.readme文件重命名为stdint.h。

1> 变量命名规则
uint32_t 使用前缀ul, u表示unsigned,l表示long ul==uint32_t
uint16_t 使用前缀us, u表示unsigned,s表示short us==uint16_t
uint8_t 使用前缀uc, u表示unsigned,c表示char uc==uint8_t
非stdint 变量使用前缀x, 如Type_t和TickType_t类型
非stdint 无符号变量使用前缀ux,如UbaseType_t(unsigned BaseType_t)
size_t 类型的变量使用前缀x;
枚举类型变量使用前缀e
指针类型变量在类型基础上附加前缀p,如指向uint16_t的指针变量前缀为pus (p_uint16_t)
char 类型变量仅被允许保存ASCII字符,前缀为c
char* 类型变量仅允许指向ASCII字符串,前缀为pc

2> 函数命名规则
在文件作用域范围的函数前缀为prv
API函数的前缀为它们的返回类型,当返回为空时,前缀为v

3> 宏命名规则
宏的名字起始部分为该宏定义所在的文件名的一部分。比如configUSE_PREEMPTION定义在FreeRTOSConfig.h文件中。
除了前缀,宏剩下的字母全部为大写,两个单词间用下划线(’_’)隔开。

数据类型
只有stdint.h和RTOS自己定义的数据类型可以使用,但也有例外情况,如下所示:
有三种类型会在移植层定义,它们是:

TickType_t:configUSE_16_BIT_TICKS=1,TickType_t定义为无符号16位类型
configUSE_16_BIT_TICKS=0,TickType_t定义为无符号32位类型

BaseType_t:定义为微处理器架构效率最高的数据类型。在32位架构处理器上BaseType_t应该定义为32位类型。
在16位架构处理器上,BaseType_t应该定义为16位类型。
BaseType_t定义为char,对于函数返回值一定要确保使用的是signed char,否则可能造成负数错误。

UbaseType_t:一个无符号BaseType_t类型

总结: ul==uint32_t, us==uint16_t, uc==uint8_t
UbaseType_t==uint32_t(32位架构处理器), UbseType_t==uint16_t(16架构处理器),跟处理器架构有关!

typedef portSTACK_TYPE StackType_t;
#define portSTACK_TYPE uint32_t

TaskFunction_t == typedef void (*TaskFunction_t)(void *);

StackType_t *pxStack; //指堆栈深度
pxStack = (StackType_t *) pvPortMalloc( ( ( (size_t) usStackDepth) * sizeof(StackType_t) ) );

// 怎么查看任务的当前运行状态
uxTaskPriorityGet():查询某个任务的优先级
vTaskPrioritySet():改变某个任务的任务优先级
uxTaskGetSystemState():获取系统中任务状态
vTaskGetInfo():获取某个任务信息
xTaskGetApplicationTaskTag():获取某个任务的标签(Tag)值
xTaskGetCurrentTaskHandle():获取当前正在运行的任务的任务句柄
xTaskGetHandle():根据任务名字查找某个任务的句柄
xTaskGetIdleTaskHandle():获取空闲任务的任务句柄
uxTaskGetStackHighWaterMark():获取任务的堆栈的历史剩余最小值,FreeRTOS 中叫做“高水位线”
eTaskGetState():获取某个任务的壮态,这个壮态是 eTaskState 类型 *
pcTaskGetName():获取某个任务的任务名字
xTaskGetTickCount():获取系统时间计数器值
xTaskGetTickCountFromISR():在中断服务函数中获取时间计数器值
xTaskGetSchedulerState():获取任务调度器的壮态,开启或未开启
uxTaskGetNumberOfTasks():获取当前系统中存在的任务数量
vTaskList():以一种表格的形式输出当前系统中所有任务的详细信息,每个任务大约需要40个字节。
vTaskGetRunTimeStats():获取每个任务的运行时间
vTaskSetApplicationTaskTag():设置任务标签(Tag)值
SetThreadLocalStoragePointer():设置线程本地存储指针
GetThreadLocalStoragePointer():获取线程本地存储指针

// 风格指南

  • 随后是Static (文件内部的)函数原型,
  • 如果注释有多行,参照本条注释风格—每一行都以’*’起始.
    */
    static void prvAFunction( uint32_t ulParameter );

include /* 首先在这里包含库文件 */

/*

/* 文件作用域变量(本文件内部使用)紧随其后,要在函数体定义之前. */
static BaseType_t xMyVariable.

/* 每一个函数的结束都有一行破折号,破折号与下面的第一个函数之间留一行空白。*/

include “FreeRTOS.h” /* 然后是FreeRTOS的头文件 */

include “HardwareSpecifics.h” /* 紧接着包含其它头文件 */

void vAFunction( void )
{
/* 函数体在此定义,注意要用大括号括住 / } /———————————————————–*/

static UBaseType_t prvNextFunction( void )
{
/* 函数体在此定义. / } /———————————————————–*/

/*

  • 函数名字总是占一行,包括返回类型。 左括号之前没有空格左括号之后有一个空格,
  • 每个参数后面有一个空格参数的命名应该具有一定的描述性.
    / void vAnExampleFunction( long lParameter1, unsigned short usParameter2 ) { / 变量声明没有缩进. */
    uint8_t ucByte; /* 代码要对齐. 大括号占独自一行. / for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ ) { / 这里再次缩进. */
    }
    }

/*

  • 由于运算符优先级的复杂性,我们不能相信自己对运算符优先级时刻保持警惕
  • 并能正确的使用,因此对于多个表达式运算时,使用括号明确优先级顺序
    */
    if( ( ucByte < fileBUFFER_LENGTH ) && ( ucByte != 0U ) )
    {
    ulResult = ( ( ulValue1 + ulValue2 ) – ulValue3 ) * ulValue4;
    }

/* 条件表达式也要像其它代码那样对齐。 */

if( configUSE_TRACE_FACILITY == 1 )

{
/* 向TCB增加一个用于跟踪的计数器. */
pxNewTCB->uxTCBNumber = uxTaskNumber;
}

endif

/方括号前后各留一个空格/
ucBuffer[ 0 ] = 0U;
ucBuffer[ fileBUFFER_LENGTH – 1U ] = 0U;

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇