写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
2024.05.07:UCOSIII第六十一节:User文件夹函数概览(uCOS-III->Source文件夹)第七部分
- 六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第七部分
- 5、uCOS-III文件夹
- Source文件夹
- os_tick.c文件
- OS_TickTask
- OS_TickTaskInit
- OS_TickListInit
- OS_TickListInsert
- OS_TickListRemove
- OS_TickListResetPeak
- OS_TickListUpdate
- os_time.c文件
- OSTimeDly
- OSTimeDlyHMSM
- OSTimeDlyResume
- OSTimeGet
- OSTimeSet
- OSTimeTick
- os_tmr.c文件
- OSTmrCreate
- OSTmrDel
- OSTmrRemainGet
- OSTmrStart
- OSTmrStateGet
- OSTmrStop
- OS_TmrClr
- OS_TmrDbgListAdd 和 OS_TmrDbgListRemove
- OS_TmrInit
- OS_TmrLink
- OS_TmrResetPeak
- OS_TmrUnlink
- OS_TmrTask
- os_type.h文件
- os_var.c文件
六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第七部分
5、uCOS-III文件夹
Source文件夹
这些文件通常是 Micrium OS (UC/OS-III) 内核的核心文件,提供了操作系统的各种基本功能和特性。
os_tick.c文件
os_tick.c 实现了 UC/OS-III 内核中的系统时钟节拍功能。
包括了时钟节拍计数器的初始化、更新、中断处理等操作的具体实现。
时钟节拍用于系统的时间管理,它确定了系统的时间分辨率和任务调度的粒度,是实现实时多任务调度的基础。
OS_TickTask
- 功能:这个函数是时钟任务,它不断地等待来自时基中断的信号,当接收到信号后,更新任务的等待时间,以便调度器可以及时地调度任务。
- 参数:这个函数没有外部参数,但是在函数内部使用了局部变量p_arg,用于预防编译警告,但实际上没有被使用。
- 其他:
通过调用OSTaskSemPend等待来自时基中断的信号。
如果接收到信号,且操作系统正在运行,则调用OS_TickListUpdate更新所有任务的等待时间。
OS_TickTaskInit
- 功能:初始化时钟任务。
- 参数:这个函数接收一个指向错误码的指针p_err,用于返回错误类型。
- 其他:
设置全局变量OSTickCtr为0,清除时钟计数器。
调用OS_TickListInit初始化时钟列表。
创建时钟任务,分配任务控制块和堆栈。
OS_TickListInit
- 功能:初始化时钟列表。
- 参数:这个函数没有参数。
- 其他:
遍历时钟轮中的所有刻度,将每个刻度的任务指针设置为NULL,以及元素数目初始化为0。
OS_TickListInsert
- 功能:将任务插入时钟列表中,以便在指定时间后调度任务。
- 参数:
p_tcb:指向任务控制块的指针。
time:指定的时间。
opt:选项,用于指定如何计算时间。
p_err:返回错误类型的指针。 - 其他:
根据指定的时间和选项,计算任务的匹配点和剩余等待时间。
根据任务的匹配点确定插入到哪个时钟轮的刻度中。
将任务插入到指定刻度的任务链表中,并更新任务之间的关系,同时更新该刻度的元素数目。
OS_TickListRemove
- 功能:从时钟列表中移除任务。
- 参数:这个函数接收一个指向任务控制块的指针p_tcb。
- 其他:
根据任务的指针获取其所在的时钟节拍列表。
如果任务确实在时钟节拍列表中,则将其从列表中移除,并更新任务之间的关系。
清空任务的延时等待时间和相关的指针,将其从时钟节拍列表中移除,并将该节拍列表中的元素数目减一。
OS_TickListResetPeak
- 功能:重置时钟列表中每个刻度的峰值检测器。
- 参数:这个函数没有参数。
- 其他:
遍历时钟轮中的所有刻度,将每个刻度的峰值检测器重置为0。
OS_TickListUpdate
- 功能:更新时钟列表,处理等待超时或延时到期的任务。
- 参数:这个函数没有参数。
- 其他:
获取当前时间戳,增加时钟节拍计数器,计算当前所在的时钟节拍列表。
遍历时钟节拍列表中的任务,根据任务的状态进行相应处理:
如果任务处于延时状态,检查任务是否已经到期,如果到期则将任务状态设置为就绪状态并从列表中移除。
如果任务处于有期限等待状态,检查任务是否已经到期,如果到期则将任务状态设置为就绪状态并从列表中移除。
如果任务处于延时被挂起状态或有期限等待被挂起状态,检查任务是否已经到期,如果到期则将任务状态设置为被挂起状态并从列表中移除。
更新任务的剩余等待时间,并记录任务等待的时间戳。
根据执行时间更新最大运行时间。
退出临界段。
os_time.c文件
os_time.c 实现了 UC/OS-III 内核中的时间管理功能。
包括了系统时钟的初始化、获取当前系统时间、延时等操作的具体实现。
时间管理模块用于处理系统的时间相关功能,如延时、定时等,确保任务按照预定的时间顺序执行。
OSTimeDly
void OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR *p_err)
这个函数的作用是让当前任务延时一段时间。
参数包括:
dly: 延时的时钟节拍数。
opt: 选项,决定延时的类型。
p_err: 返回错误类型的指针。
在函数的实现中,首先对参数进行了检查,包括检查是否在中断中调用、是否任务被锁、选项是否合法等。然后根据选项类型执行相应的延时操作,最后将当前任务从就绪列表移除,插入到延时列表中,然后执行任务调度。
OSTimeDlyHMSM
void OSTimeDlyHMSM(CPU_INT16U hours, CPU_INT16U minutes, CPU_INT16U seconds, CPU_INT32U milli, OS_OPT opt, OS_ERR *p_err)
这个函数的作用和 OSTimeDly 类似,但是参数更具体化,可以直接指定时、分、秒、毫秒来进行延时。
在函数的实现中,首先对参数进行了检查,包括检查是否在中断中调用、是否任务被锁、选项是否合法等。然后根据选项类型计算延时的时钟节拍数,最后执行延时操作。
OSTimeDlyResume
void OSTimeDlyResume(OS_TCB *p_tcb, OS_ERR *p_err)
这个函数的作用是终止一个延时的任务,使其立即变为就绪状态。
- 参数包括:
p_tcb: 要终止延时的任务控制块。
p_err: 返回错误类型的指针。
在函数的实现中,首先对参数进行了检查,包括检查任务是否为空、是否在中断中调用等。然后根据任务的状态进行不同的处理,如果任务处于延时状态,则将其从延时列表中移除,并插入到就绪列表中,最后执行任务调度。
OSTimeGet
OS_TICK OSTimeGet(OS_ERR *p_err)
- 参数:
p_err: 一个指向 OS_ERR 类型的指针,用于返回错误码,如果没有错误则为 OS_ERR_NONE。 - 返回值:
OS_TICK: 当前的时钟节拍计数值。
OSTimeSet
void OSTimeSet(OS_TICK ticks, OS_ERR *p_err)
- 参数:
ticks: 要设置的时钟节拍计数值。
p_err: 一个指向 OS_ERR 类型的指针,用于返回错误码,如果没有错误则为 OS_ERR_NONE。 - 返回值:
无(void)。
OSTimeTick
void OSTimeTick(void)
-
参数:
无。 -
返回值:
无(void)。 -
OSTimeTick函数的逻辑解释:
OSTimeTick 函数用于处理系统的时钟节拍事件。
首先调用 OSTimeTickHook 函数,这是一个用户可定义的钩子函数,可以用于在时钟节拍到来时执行特定的操作。
然后根据系统配置,可能会执行以下操作:
如果启用了中断发送延迟(OS_CFG_ISR_POST_DEFERRED_EN > 0u),则将任务就绪信息发送到中断队列中,稍后由中断服务例程处理。
如果禁用了中断发送延迟,则直接将任务就绪信息发送给时钟节拍任务(OSTickTask)。
如果启用了时间片轮转调度(OS_CFG_SCHED_ROUND_ROBIN_EN > 0u),则检查当前任务的时间片是否耗尽,如果是,则切换到同优先级的其他任务运行。
如果启用了软件定时器(OS_CFG_TMR_EN > 0u),则更新软件定时器的计数器,如果计数器减至0,则发送信号给软件定时器任务(OSTmrTask)。
os_tmr.c文件
os_tmr.c 实现了 UC/OS-III 内核中的定时器功能。
包括了定时器的创建、启动、停止、删除等操作的具体实现。
定时器用于在指定的时间间隔内执行特定的任务或事件,是实现系统定时功能的重要组成部分。
OSTmrCreate
此函数用于创建定时器。它接受多个参数,包括定时器控制块指针 p_tmr、定时器名称指针 p_name、初始延迟时间 dly、周期时间 period、选项 opt、定时器到期时的回调函数指针 p_callback 和传递给回调函数的参数指针 p_callback_arg。函数将指定的参数值写入定时器控制块中,并根据指定的选项进行不同的操作。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。
OSTmrDel
此函数用于删除定时器。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数首先进行参数检查,然后根据定时器的状态进行相应的处理,包括从定时器链表中移除定时器、清除定时器的状态并解锁调度器。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。
OSTmrRemainGet
此函数用于获取定时器剩余时间。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数根据定时器的状态计算定时器剩余时间,并返回该值。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。
OSTmrStart
此函数用于启动定时器。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数根据定时器的状态进行相应的处理,包括从定时器链表中移除定时器并重新插入到定时器链表中。如果函数执行成功,将错误类型指针 p_err 设置为 OS_ERR_NONE,否则设置为相应的错误类型。
OSTmrStateGet
此函数用于获取定时器的状态。它接受定时器控制块指针 p_tmr 和错误类型指针 p_err 作为参数。函数首先进行参数检查,然后获取定时器的状态并根据状态设置错误类型。最后返回定时器的状态。
OSTmrStop
此函数用于停止定时器。它接受定时器控制块指针 p_tmr、选项 opt、传递给回调函数的新参数 p_callback_arg 和错误类型指针 p_err 作为参数。函数根据定时器的状态和选项进行相应的处理,包括从定时器链表中移除定时器、执行回调函数等。最后返回执行结果。
OS_TmrClr
此函数用于清除定时器的字段。它接受定时器控制块指针 p_tmr 作为参数,并将定时器的各个字段重置为初始值。
OS_TmrDbgListAdd 和 OS_TmrDbgListRemove
这两个函数用于调试,用于将定时器添加到调试链表或从调试链表中移除定时器。调试链表用于跟踪定时器的状态和调试信息。
OS_TmrInit
此函数用于初始化定时器模块。它接受一个指向错误类型的指针 p_err。函数首先进行安全性检查,然后根据配置的定时器任务频率计算定时器更新计数器 OSTmrUpdateCnt。接着初始化其他相关的计数器和变量,并创建定时器任务。
OS_TmrLink
此函数用于将定时器链接到定时器轮中。它接受一个指向定时器控制块的指针 p_tmr 和一个选项 opt。函数首先确定定时器的匹配时间,并根据选项将定时器插入到合适的定时器轮中。
OS_TmrResetPeak
此函数用于重置定时器轮中每个轮子的最大成员数。它简单地将每个轮子的最大成员数设置为零。
OS_TmrUnlink
此函数用于将定时器从定时器轮中解除链接。它接受一个指向定时器控制块的指针 p_tmr。函数首先根据定时器的匹配时间确定定时器所在的轮子,然后将定时器从轮子中移除。
OS_TmrTask
此函数是定时器任务的主要函数。它接受一个指向参数的指针,该参数当前未使用。函数在一个循环中等待定时器任务信号,然后锁定调度器并更新定时器轮中的定时器状态。在每次循环中,它会检查定时器是否到期,如果到期,则执行相应的回调函数并将定时器从定时器轮中移除。
os_type.h文件
os_type.h 是 UC/OS-III 内核中使用的数据类型定义和宏定义的头文件。
定义了 UC/OS-III 内核中使用的各种数据类型、常量和宏,以及一些平台相关的配置选项。
提供了对于 UC/OS-III 内核的跨平台支持,使得代码可以在不同的处理器架构上移植和使用。
os_var.c文件
os_var.c 实现了 UC/OS-III 内核中的全局变量和内存区域的管理。
包括了全局变量的初始化、内存区域的分配和释放等操作的具体实现。
全局变量和内存区域管理模块用于管理 UC/OS-III 内核中的全局数据和动态内存,确保数据的正确性和一致性。