写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
COSIIIUseruCOSIIISource_12">六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第一部分
COSIII_13">5、uCOS-III文件夹
Source文件夹
这些文件通常是 Micrium OS (UC/OS-III) 内核的核心文件,提供了操作系统的各种基本功能和特性。
os.h文件
这个头文件包含了 UC/OS-III 内核的公共函数声明、数据结构定义和常量定义。
它是用户代码与 UC/OS-III 内核之间的接口,定义了用户可以调用的操作系统函数和宏。
后续会详细解释。
os_cfg_app.c文件
这个文件包含了用户配置的 UC/OS-III 内核的配置参数。
用户可以在这里设置操作系统的各种配置选项,如任务数量、任务堆栈大小、时间片大小等。
-
常量和数据存储:
- 文件开始定义了各种数据存储元素,如任务堆栈、消息池、中断队列等相关结构。这些是操作系统用于管理任务、消息、中断等的静态分配内存区域。
-
配置常量:
- 定义了各种系统配置的常量,如堆栈大小、任务优先级、消息池大小等。这些常量用于配置操作系统的行为和资源分配。
-
OS 配置初始化函数 (
OSCfg_Init
):- 此函数用于确保配置文件中声明为
const
的某些调试变量不会被编译器优化掉。它通过引用这些变量来实现,从而强制编译器保留它们。这很重要,因为这些变量的目的是供外部检查,用于调试或监视目的。
- 此函数用于确保配置文件中声明为
-
参数解释:
- 参数,如堆栈大小、任务优先级、消息池大小等,被定义为常量。这些参数定义了操作系统的行为和资源分配。例如:
-
条件编译的使用:
- 使用条件编译指令(
#if
、#endif
)根据配置选项条件地包含或排除某些代码部分。例如,根据配置中是否启用了某些功能,可能会包含或排除与中断处理或定时器管理相关的某些代码段。
- 使用条件编译指令(
总的来说,该文件提供了操作系统的全面配置,允许开发人员根据其特定需求定制系统的行为。
os_core.c文件
这个文件包含了 UC/OS-III 内核的核心功能的实现,如任务调度、中断处理等。
它包括了 UC/OS-III 内核的初始化、任务调度器的实现、中断处理函数等。
OSInit
OSInit(OS_ERR *p_err)
这是RTOS的初始化函数。它用于初始化RTOS的各个模块和数据结构,为系统的正常运行做准备。
p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。如果初始化过程中发生错误,函数会将相应的错误码存储到 p_err 所指向的位置中。
OSIntEnter和 OSIntExit
这两个函数用于处理中断的进入和退出过程。
OSIntEnter 函数用于记录进入中断的次数,以便在中断嵌套过深时进行检查。
OSIntExit 函数用于处理中断退出,包括恢复中断状态、检查是否需要进行任务切换等操作。
OSSched
这是RTOS的调度器函数。它用于选择下一个要执行的任务,并进行任务切换。
在调度过程中,会检查当前系统状态,包括是否有中断嵌套、调度器是否被锁定等情况,以保证调度的正确性。
调度器会根据任务的优先级选择下一个要执行的任务,并进行任务切换操作。
OSSchedLock
void OSSchedLock(OS_ERR *p_err)
这个函数用于锁定调度器,防止任务切换发生。
参数 p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
在函数中会进行一系列的检查:
检查系统是否正在运行,如果没有运行则返回错误码 OS_ERR_OS_NOT_RUNNING。
检查是否处于中断嵌套状态,如果是则返回错误码 OS_ERR_SCHED_LOCK_ISR。
检查调度器是否已经被锁定,如果是则返回错误码 OS_ERR_LOCK_NESTING_OVF。
如果以上检查都通过,则锁定调度器,并将错误码设为 OS_ERR_NONE。
OSSchedUnlock
void OSSchedUnlock(OS_ERR *p_err)
这个函数用于解锁调度器,允许任务切换发生。
参数 p_err 同样是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
函数中的操作包括:
检查系统是否正在运行,如果没有运行则返回错误码 OS_ERR_OS_NOT_RUNNING。
检查调度器是否已经被锁定,如果没有被锁定则返回错误码 OS_ERR_SCHED_NOT_LOCKED。
如果调度器被成功解锁,则重新使能调度器并执行一次调度。
Cfg_85">OSSchedRoundRobinCfg
void OSSchedRoundRobinCfg(CPU_BOOLEAN en, OS_TICK dflt_time_quanta, OS_ERR *p_err)
这个函数用于配置循环调度(Round Robin)的参数。
参数 en 是一个布尔值,用于启用或禁用循环调度。
参数 dflt_time_quanta 是一个时间片大小的设置,用于指定任务的默认时间片大小。
参数 p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
在函数中会进行一系列的操作:
根据参数设置循环调度的使能状态和默认时间片大小。
函数执行完成后,会将错误码设为 OS_ERR_NONE。
OSSchedRoundRobinYield
void OSSchedRoundRobinYield(OS_ERR *p_err)
这个函数用于手动触发循环调度下的任务切换。
参数 p_err 同样是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
函数中的操作包括:
检查是否处于中断嵌套状态,如果是则返回错误码 OS_ERR_YIELD_ISR。
检查调度器是否被锁定,如果是则返回错误码 OS_ERR_SCHED_LOCKED。
检查循环调度是否被禁用,如果是则返回错误码 OS_ERR_ROUND_ROBIN_DISABLED。
将当前任务移动到就绪列表的末尾,以触发任务切换。
函数执行完成后,会将错误码设为 OS_ERR_NONE。
OSStart
void OSStart(OS_ERR *p_err)
这个函数用于启动操作系统。
参数 p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
函数中的操作包括:
检查操作系统的运行状态,如果操作系统处于停止状态,则执行以下操作:
获取最高优先级任务的信息,包括优先级、任务控制块指针等。
将当前任务设置为最高优先级任务,将操作系统状态设置为运行状态。
执行特定于目标的代码以启动任务。
将错误码设为 OS_ERR_FATAL_RETURN,表明 OSStart() 不应该返回。
如果操作系统已经在运行,则将错误码设为 OS_ERR_OS_RUNNING。
OSVersion
CPU_INT16U OSVersion(OS_ERR *p_err)
这个函数用于获取操作系统的版本号。
参数 p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
函数中的操作包括:
返回操作系统的版本号 OS_VERSION。
将错误码设为 OS_ERR_NONE。
OS_IdleTask
void OS_IdleTask(void *p_arg)
这个函数是一个空闲任务,用于在系统无其他任务可执行时执行。
参数 p_arg 是一个指向参数的指针,用于传递给任务的参数。
函数中的操作包括:
在一个无限循环中,周期性地执行空闲任务的操作。
在每次循环中,增加空闲任务计数器,并执行用户定义的空闲任务钩子函数。
OS_IdleTaskInit
void OS_IdleTaskInit(OS_ERR *p_err)
这个函数用于初始化空闲任务。
参数 p_err 是一个指向错误码的指针,用于传递函数执行过程中的错误信息。
函数中的操作包括:
初始化空闲任务计数器。
创建空闲任务,设置其优先级为系统最低优先级,通常是 OS_CFG_PRIO_MAX - 1u。
设置空闲任务的栈空间和其他参数。
将错误码设为 OS_ERR_NONE。
OS_Pend
void OS_Pend(OS_PEND_DATA *p_pend_data, OS_PEND_OBJ *p_obj, OS_STATE pending_on, OS_TICK timeout)
这个函数用于使任务进入挂起状态,等待某个事件的发生。
p_pend_data 是一个指向挂起数据结构的指针,用于存储任务挂起时的相关信息。
p_obj 是一个指向挂起对象的指针,用于表示任务挂起所等待的对象。
pending_on 表示任务挂起所等待的事件类型。
timeout 表示任务挂起的超时时间,如果超过该时间仍未等到事件发生,则任务会被唤醒。
OS_PendAbort
void OS_PendAbort(OS_PEND_OBJ *p_obj, OS_TCB *p_tcb, CPU_TS ts)
这个函数用于终止任务的挂起状态,使任务不再等待某个事件的发生。
p_obj 是一个指向被挂起的对象的指针。
p_tcb 是一个指向任务控制块的指针,表示需要终止挂起状态的任务。
ts 表示终止挂起状态的时间戳。
OS_PendAbort1
void OS_PendAbort1(OS_PEND_OBJ *p_obj, OS_TCB *p_tcb, CPU_TS ts)
这个函数用于在任务挂起列表中找到并标记被终止的挂起对象。
p_obj 是一个指向被挂起的对象的指针。
p_tcb 是一个指向任务控制块的指针,表示需要终止挂起状态的任务。
ts 表示终止挂起状态的时间戳。