基于freertos的嵌入式系统开发(二)系统配置2
堆栈的配置
最小堆栈值
在嵌入式系统中,在空闲、定时等一些系统任务中,执行功能短小精悍,或为空函数,不需要很多的堆栈值,当然,有些简单的任务也可以使用这个定义的堆栈值。配置项为:
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 )
注意:该数字的单位,一般在ARM中为4个字节。
系统总堆(栈)大小
系统总堆(栈)的大小,往往决定于主处理器的资源情况情况来定义定义这个值。不能太小,太小内存容易溢出;太大也受限于芯片RAM本身大小,另外还需要预留全局变量、动态分配内存等存储空间的需要。配置项为:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 52 * 1024 ) )
这个一般要比configMINIMAL_STACK_SIZE大好多,适应较大型任务的需求。
任务相关的配置
任务名称最大长度
在C语言中,比较著名的命名规则有匈牙利命名法、骆驼(Camel)命名法和帕斯卡(Pascal)命名法,匈牙利命名法其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。例如:
lpStr, 表示指向一个以'\0'结尾的字符串的长指针(lp)变量。
而骆驼(Camel)命名法指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。例如 :
printDateString(),函数名中每一个逻辑断点都有一个大写字母来标记。
帕斯卡(Pascal)命名法与骆驼命名法类似。只是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。例如:
DisplayInfo()采用了帕斯卡命名法。
上述命名法则的提出,总体目标是提高程序的可读性,达到见名知意的目的,当然,实际命名时也可以将几种命名法结合使用,例如变量名采用匈牙利命名法,而函数采用帕斯卡命名法。所以,在freertos中,任务名称的定义最后按照其功能和命名规范进行,配置项:
#define configMAX_TASK_NAME_LEN ( 16 )
规定任务名称最大16字节,例如:我们定义TaskDualComm为双机通信任务的任务名称,就采用了帕斯卡命名法。而尽量少用TASK1、Task2等名字
APPLICATION_TASK_TAG
在freertos中,函数 xTaskGetApplicationTaskTag()用于获取任务的 Tag(标签)值,标签的功能由用户自行决定,要使用此函数的话,配置项:
#define configUSE_APPLICATION_TASK_TAG 1
必须为 1,另外,函数:
portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter );
的使用也必须定义此宏。
协程相关配置
在FreeRTOS中,协程(coroutine),是由线程并发出来的,没有独立的栈空间,同一个线程并发出来的所有协程共用栈空间,我们知道一般的操作系统,多任务是需要在中断过程中切换堆栈的,算力开销较大,而协程的功能就是在尽量降低开销的情况下,实现上下文快速切换的办法。
是否使用协程
配置项:
#define configUSE_CO_ROUTINES 1
设置成1表示使用协程,0表示不使用协程。如果使用协程,必须在工程中包含croutine.c文件。
协程优先级数目
配置项:
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
任何数目的协程都可以共享一个优先级。使用协程可以单独的分配给任务优先级。其中 0是最低的优先级﹐configMAx_CO_ROUTINE_PRIORITIES-1为最高的优先级。