ucosIII OS_CFG.H 解释

来源:互联网 发布:大乐透软件破解版 编辑:程序博客网 时间:2024/05/16 15:07

想要对ucos 的功能进行裁剪,必不可少的需要了解OS_CFG.H 文件。这里对官方的《ucosIII User's Manual.pdf》文档,

B-1 μC/OS-III FEATURES (OS_CFG.H)章节,进行简要的翻译,如有歧义,以原文为主。

B-1 μC/OS-III FEATURES (OS_CFG.H)


相关宏定义说明如下:

OS_CFG_APP_HOOKS_EN:
当#define设置为1时,说明μC/OS-III的钩子函数(介入函数)可以调用用户定义的钩子函数。从而实现μC/OS-III自身的功能能够扩充,通过用户程序代码实现。
当然,如果根本不打算扩充μC/OS-III钩子函数功能,则将该宏设置为0,来节省内存(例如,函数指针的开销)。


OS_CFG_ARG_CHK_EN:
该宏决定用户是否希望对μC/OS-III的大部分函数执行参数检查,如确保传递传递给函数的指针非NULL、参数值在允许的范围内、选项是有效的等。
当设置为0时,将禁止参数检查功能,相应的节省内核的代码空间和处理时间。
统计发现,μC/OS-III为超过40个函数提供参数检查功能。因此,禁用此选项将节约几百字节的代码空间。
应用中,可以考虑调试阶段开启此选项,项目的后期发布阶段禁止该选项。


OS_CFG_CALLED_FROM_ISR_CHK_EN:
决定内核是否进行检查以确保大多数的函数没有被ISR调用。换句话说,大多数μC/OS-III函数应该只被任务级代码调用,除了“POST”类的发送函数(它们可以被ISR调用)。
μC/OS-III为大约50个函数提供此项检查。因此,禁用此选项,将节约几百字节的代码空间。
应用中,可以考虑调试阶段开启此选项,项目的后期发布阶段禁止该选项。


OS_CFG_DBG_EN:
当这个宏设置为1时,os_dbg.c中的ROM常量将被添加以帮助支持内核调试器。具体来说,调试器将可以通过查询一系列所谓的ROM变量,来获知编译时的选项。例如,调试器可以找出OS_TCB的尺寸大小、μC/OS-III的版本号、一个事件标志组的尺寸(OS_FLAG_GRP)等。


OS_CFG_FLAG_EN:
设置为1时,允许生成事件标志服务的代码和数据结构,即开启了事件标志服务功能。
如果设置为0,那么无需再开启/禁止该文件中任何名称为OS_CFG_FLAG_xxx的#define常量。
应用不需要相关服务时,可以禁止该功能,以此来减少代码和数据的空间需求。


OS_CFG_FLAG_DEL_EN:
决定是否生成OSFlagDel()函数代码。


OS_CFG_FLAG_MODE_CLR_EN:
是否生成代码用于等待事件标志变为0.通常是等待事件标志被置为1。但是用户也可能需要等待事件标志的清零,在这种情况下,需要开启此选项。


OS_CFG_FLAG_PEND_ABORT_EN:
OSFlagPendAbort().函数是否生成。


OS_CFG_ISR_POST_DEFERRED_EN
当置为1时,将减小中断延迟,因为在μC/OS-III的大多数临界段代码中将不再禁用中断。相反,在这些临界段代码执行期间,调度器将被锁定。该宏设置为1的好处是中断延迟小,但是,ISR到任务的响应时间会变得略长。如果启用了以下服务,建议设置改为1,因为若设置它为0,则中断延迟有可能会变得无法接受的长:

需要选择的是:
OS_CFG_ISR_POST_DEFERRED_EN set to 1
中断延迟短,ISR—任务响应长。
OS_CFG_ISR_POST_DEFERRED_EN set to 0
中断延迟(见上表),ISR-任务响应短。


OS_CFG_MEM_EN:
决定是否生成分区存储管理代码和相关的数据结构。这让用户在不使用存储分区时,减少代码和数据的空间需求。


OS_CFG_MUTEX_EN:
决定是否开启互斥信号量服务的代码和数据结构。
同其他的内核服务开关一样,OS_CFG_MUTEX_EN被设置为0,那么无需再开启/禁止本系统中任何名为OS_CFG_MUTEX_XXX 的#define常量。


OS_CFG_MUTEX_DEL_EN:
是否生成OSMutexDel().代码。


OS_CFG_MUTEX_PEND_ABORT_EN:
是否生成OSMutexPendAbort().代码


OS_CFG_OBJ_TYPE_CHK_EN:
决定是否让大多数的μC/OS-III函数检查其操作的内核对象类型是否正确。换言之,如果希望发送一个信号量,那么用户传递的是否确实是一个信号量,或者错误的使用了其他类型的内核对象呢?
μC/OS-III的内核对象检查大约有30处,禁用该选项,将节约几百字节的代码空间以及部分的处理时间。
建议调试阶段开启该选项;释放代码时关闭该检查项。


OS_CFG_PEND_MULTI_EN:
决定代码是否支持等待多个事件(如信号量或消息队列),启用(1)或禁用(0)。


OS_CFG_PRIO_MAX:
指定应用程序可用优先级的最大数量。将该宏指定为刚好够用户计划使用的优先级数量,将减少μC/OS-III所需的RAM量。
在μC/OS-III.中,如果OS_PRIO数据类型为CPU_INT08U,则任务优先级可以从0(最高优先级)到最大255(最低优先级)。然而在μC/OS-III中,对于优先级的数量实际上没有限制。
具体来说,如果定义OS_PRIO数据类型为CPU_INT16U,则任务优先级将多达65536个。应该总是设置OS_CFG_PRIO_MAX为8的倍数(如8,16,32,6,4,128,256等),设置的优先级数量越多,μC/OS-III.的RAM开销越大。
另,μC/OS-III.为自身保留了优先级(OS_CFG_PRIO_MAX-2)和(OS_CFG_PRIO_MAX-1);前者用于空闲任务OS_IdleTask()。此外,不要将优先级0用于任何应用程序没因为它是μC/OS-III.保留作为ISR处理任务的。因此,应用程序的优先级可以在2到(OS_CFG_PRIO_MAX-3)之间(含)取值。


OS_CFG_Q_EN:
决定是否生成消息队列服务的代码和数据结构。
同其他的内核服务开关一样,OS_CFG_Q_EN被设置为0,那么无需再开启/禁止本系统中任何名为OS_CFG_Q_XXX 的#define常量。


OS_CFG_Q_DEL_EN:


OS_CFG_Q_FLUSH_EN:


OS_CFG_Q_PEND_ABORT_EN:


OS_CFG_SCHED_LOCK_TIME_MEAS_EN:

决定是否生成 测量调度器锁定时间(measure the amount of time the scheduler is locked) 的代码。这主要用于确定任务延迟。


OS_CFG_SCHED_ROUND_ROBIN_EN:
决定是否生成时间片轮转调度代码。


OS_CFG_SEM_EN:
信号量相关的服务工能开关宏


OS_CFG_SEM_DEL_EN:


OS_CFG_SEM_PEND_ABORT_EN:


OS_CFG_SEM_SET_EN:


OS_CFG_STAT_TASK_EN:

决定是否启用μC/OS-III.的统计任务OS_StatTask(),以及他的初始化函数void OS_StatTaskInit ()。
OS_StatTask()计算应用程序的CPU使用率、每个任务的堆栈开销、每个任务在运行时的CPU使用率等。
当启用时,OS_StatTask()按照OS_CFG_TICK_RATE_HZ(see os_cfg_app.h)的频率执行。计算OSStatTaskCPUUsage的值时应该注意,它是一个应用程序CPU使用率的百分比值。OS_StatTask()在每次执行时调用OSStatTaskHook()钩子函数,进而用户可以通过它添加自定义的统计功能。统计任务的详细信息,参见os_stat.c。OS_StatTask()的优先级是应用程序中可配置的(see os_cfg_app.h)
如果OS_CFG_STAT_TASK_STK_CHK_EN被设为1,则OS_StatTask()还将计算每个任务的堆栈使用情况。此时OS_StatTask()每次执行时,将为每个任务调用OSTaskStkChk(),并将结果放置在该任务的TCB中。任务TCB的.StkFree 和.StkUsed域分别代表剩余空间(字节单位)已用空间(字节单位)。
如果OS_CFG_STAT_TASK_STK_CHK_EN被设为0,则统计任务用到的所有变量都将没有声明(见os.h),当然也将减少内核的RAM开销。


OS_CFG_STAT_TASK_STK_CHK_EN:
决定统计任务是否为每个任务调用OSTaskStkChk()堆栈监测。为了做到这一点,需要将OS_CFG_STAT_TASK_EN设置为1(即统计任务需要开启)。当然,可以在某个任务中调用OSTaskStkChk()函数以获得这个任务的此类信息。


OS_CFG_STK_SIZE_MIN:
定义各个任务的最小堆栈大小(以CPU_STK为单元)。这为μC/OS-III在每个任务创建时提供了足够的堆栈空间。假设一个处理器包含16个32位的寄存器。同样,假设CPU_STK被声明为CPU_INT32U类型,那么最低限度,设置OS_CFG_STK_SIZE_MIN为16.然而,这将是很不明智的,因为可能无法容纳存储局部变量、函数调用的返回、可能的ISR嵌套。
请参阅处理器的“移植”来看看如何设置这个最小值。注意,这是一个保障,来确保有足够的任务堆栈空间。


OS_CFG_TASK_CHANGE_PRIO_EN:
决定是否生成OSTaskChangePrio()函数。


OS_CFG_TASK_DEL_EN:


OS_CFG_TASK_Q_EN:

决定是否生成直接向/从任务和ISR发送和接收消息的OSTaskQXXX()函数代码。
直接向一个任务发送消息回避通过消息队列发送消息更有效率一些,因为不再有与消息关联的等待表。


OS_CFG_TASK_Q_PEND_ABORT_EN:


OS_CFG_TASK_PROFILE_EN:

决定是否允许在每个任务的OS_TCB中分配变量来保存各个任务的性能数据。如果开启,则每个任务将有一些变量来跟踪任务切换的次数、任务的执行时间、任务相对其他任务的CPU使用率等。
这项功能提供的信息对于调试非常有用,但需要额外的RAM,软件释放的时候关掉就好啦。


OS_CFG_TASK_REG_TBL_SIZE:
该宏允许各个任务拥有任务上下文变量(This constant allows each task to have task context variables)。可以使用任务变量存储诸如“errno”、任务标识和其他的 任务相关的数值等元素。任务拥有的变量数目是由这个常量设置的。每个任务都有一个唯一的标识,从0到(OS_CFG_TASK_REG_TBL_SIZE-1)。此外。每个任务变量被声明为OS_REG数据类型(见os_type.h)。如果OS_REG被定义为CPU_INT32U,那么此表中所有的变量都为这种类型。


OS_CFG_TASK_SEM_PEND_ABORT_EN:
Include code for OSTaskSemPendAbort()


OS_CFG_TASK_SUSPEND_EN:
决定是否包含OSTaskSuspend() and OSTaskResume()实现代码,。任务挂起和任务恢复功能在调试时是非常有用的,特别是可以在运行时通过一个终端借口调用这些函数。。。


OS_CFG_TIME_DLY_HMSM_EN:
Include code for OSTimeDlyHMSM(),用于将一个任务延迟指定的(时,分,秒和毫秒)。


OS_CFG_TIME_DLY_RESUME_EN:
Include code for OSTimeDlyResume(),用于立刻恢复被任务延迟函数挂起的任务。


OS_CFG_TLS_TBL_SIZE:
决定数组的大小:.TLS_Tbl[],在每个任务的OS_TCB。
OS_CFG_TLS_TBL_SIZE为TLS(thread-local storage)服务,当OS_CFG_TLS_TBL_SIZE大于0时开启,等于0时禁用。TLS特性在V3.03.00.版本加入。


OS_CFG_TMR_EN:
决定是否生成定时器管理服务的代码。


OS_CFG_TMR_DEL_EN:
Enable (1) or Disable (0) code generation for OSTmrDel()


以上为OS_CFG.H文件相关宏定义的解释。。。

0 0
原创粉丝点击