写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
2024.05.06:UCOSIII第六十节:User文件夹函数概览(uCOS-III->Source文件夹)第六部分
- 六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第六部分
- 5、uCOS-III文件夹
- Source文件夹
- os_sem.c文件
- OSSemCreate
- OSSemDel
- OSSemPend
- OSSemPendAbort
- OSSemPost
- OSSemSet
- OS_SemClr
- OS_SemDbgListAdd
- OS_SemDbgListRemove
- OS_SemInit
- OS_SemPost
- os_stat.c文件
- OSStatReset
- OSStatTaskCPUUsageInit
- OS_StatTask
- OS_StatTaskInit
- os_task.c文件
- OSTaskChangePrio
- OSTaskCreate
- OSTaskDel
- OSTaskQFlush
- OSTaskQPend
- OSTaskQPendAbort
- OSTaskQPost
- OSTaskRegGet
- OSTaskRegGetID
- OSTaskRegSet
- OSTaskResume
- OSTaskSemPend
- OSTaskSemPendAbort
- OSTaskSemPost
- OSTaskSemSet
- OSTaskStkChk
- OSTaskSuspend
- OSTaskTimeQuantaSet
- OS_TaskDbgListAdd 和 OS_TaskDbgListRemove
- OS_TaskInit
- OS_TaskInitTCB
- OS_TaskQPost
- OS_TaskResume
- OS_TaskReturn
- OS_TaskSemPost
- OS_TaskSuspend
六十七、UCOSIII:User文件夹函数概览(uCOS-III->Source文件夹)第六部分
5、uCOS-III文件夹
Source文件夹
这些文件通常是 Micrium OS (UC/OS-III) 内核的核心文件,提供了操作系统的各种基本功能和特性。
os_sem.c文件
os_sem.c 实现了 UC/OS-III 内核中的信号量(Semaphore)功能。
包括了信号量的创建、等待、释放等操作的具体实现。
信号量用于任务间的同步和资源管理,它可以控制多个任务对共享资源的访问,防止资源竞争和冲突。
OSSemCreate
- 功能:创建一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。
p_name:多值信号量的名称。
cnt:初始的信号量计数值,表示资源的个数或事件是否发生的标志。
p_err:返回错误类型的指针。 - 其他:该函数用于创建一个多值信号量,初始化相关数据结构,并根据给定的初始计数值设置信号量的资源数目。
OSSemDel
- 功能:删除一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。
opt:选项,可以是删除等待的任务中的一个或全部。
p_err:返回错误类型的指针。 - 其他:该函数用于删除一个多值信号量,可以选择删除等待的任务中的一个或全部,或者在没有任务等待的情况下立即删除。
OSSemPend
- 功能:请求一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。
timeout:等待超时时间。
opt:选项,用于指定等待是否会堵塞。
p_ts:返回等到信号量时的时间戳的指针。
p_err:返回错误类型的指针。 - 其他:该函数用于请求一个多值信号量,并根据选项设置是否会堵塞等待。如果信号量的资源数目不为零,则立即获取资源;否则根据选项决定是否堵塞等待。
OSSemPendAbort
- 功能:中止等待中的任务对一个多值信号量的等待。
- 参数:
p_sem:指向多值信号量控制块的指针。
opt:选项,用于指定中止等待的任务数量。
p_err:返回错误类型的指针。 - 其他:该函数用于中止等待中的任务对一个多值信号量的等待,可以选择中止一个或全部等待中的任务。
OSSemPost
- 功能:释放一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。
opt:选项,用于指定释放资源的数量。
p_err:返回错误类型的指针。 - 其他:该函数用于释放一个多值信号量的资源,可以选择释放一个或全部资源,并根据选项决定是否进行任务调度。
OSSemSet
- 功能:设置一个多值信号量的资源数目。
- 参数:
p_sem:指向多值信号量控制块的指针。
cnt:设置的信号量资源数目。
p_err:返回错误类型的指针。 - 其他:该函数用于设置一个多值信号量的资源数目,可以设置为任意非负整数,但如果有任务在等待该信号量,可能会导致错误。
OS_SemClr
- 功能:清除一个多值信号量的相关数据结构。
- 参数:
p_sem:指向多值信号量控制块的指针。 - 其他:该函数用于清除一个多值信号量的相关数据结构,将其恢复到初始状态。
OS_SemDbgListAdd
- 功能:将一个多值信号量插入到调试列表的最前端。
- 参数:
p_sem:指向多值信号量控制块的指针。 - 其他:该函数用于将一个多值信号量插入到调试列表的最前端,用于跟踪和调试多值信号量的使用情况。
OS_SemDbgListRemove
- 功能:从调试列表中移除一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。 - 其他:该函数用于从调试列表中移除一个多值信号量,当不再需要跟踪和调试该信号量时使用。
OS_SemInit
- 功能:初始化多值信号量。
- 参数:
p_err:返回错误类型的指针。 - 其他:该函数用于初始化多值信号量,包括调试列表的初始化,将信号量的计数值置零,并返回无错误状态。
OS_SemPost
- 功能:发布一个多值信号量。
- 参数:
p_sem:指向多值信号量控制块的指针。
opt:选项,用于指定发布资源的数量和是否调度任务。
ts:时间戳,用于记录发布资源的时间。
p_err:返回错误类型的指针。 - 其他:该函数用于发布一个多值信号量的资源,可以选择发布给所有等待任务或优先级最高的等待任务,并根据选项决定是否进行任务调度。
os_stat.c文件
os_stat.c 实现了 UC/OS-III 内核中的统计信息功能。
包括了统计内核运行时间、任务运行时间、中断次数等系统运行状态信息的功能。
这些统计信息可以帮助开发者评估系统的性能,分析系统运行状况,优化系统设计。
OSStatReset
- 功能:重置统计数据,包括任务、中断、定时器和消息队列的统计信息。
- 参数:
p_err:返回错误类型的指针。 - 其他:这个函数用于重置系统的各项统计数据,包括任务执行时间、中断禁用时间、任务堆栈使用情况等。
OSStatTaskCPUUsageInit
- 功能:初始化统计任务用于计算 CPU 使用率。
- 参数:
p_err:返回错误类型的指针。 - 其他:这个函数用于初始化统计任务,以计算 CPU 使用率。它通过暂时挂起定时器任务,并在一段时间内测量空闲任务的运行次数,以计算 CPU 使用率。
OS_StatTask
- 功能:统计任务,用于周期性地收集和更新系统的统计信息。
参数**:
p_arg:任务参数(未使用)。 - 其他:这个函数是一个独立的统计任务,定期收集并更新系统的统计信息,包括 CPU 使用率、任务执行时间、中断禁用时间等。
OS_StatTaskInit
- 功能:初始化统计任务,包括创建统计任务的任务控制块(TCB)和分配堆栈空间。
- 参数:
p_err:返回错误类型的指针。 - 其他:
首先,函数将统计任务的计数器重置为零,并将任务设置为未准备状态。
然后,它检查统计任务所需的堆栈和优先级是否合法,并创建统计任务。如果堆栈无效、堆栈大小不足、或优先级超出范围,会返回相应的错误代码。
最后,它使用 OSTaskCreate 函数创建统计任务,并传递了任务的相关参数,包括任务名、入口函数、优先级、堆栈地址和大小等。
os_task.c文件
os_task.c 实现了 UC/OS-III 内核中的任务管理功能。
包括了任务的创建、删除、挂起、恢复、优先级调整等操作的具体实现。
任务管理模块负责管理系统中的任务,调度器会根据任务的优先级和状态来决定任务的执行顺序。
OSTaskChangePrio
- 功能:改变任务的优先级。
- 参数:
p_tcb:指向要修改优先级的任务控制块的指针。
prio_new:新的优先级。
p_err:返回错误类型的指针。 - 其他:
函数首先进行一些安全性检查,例如检查是否处于中断上下文,以及是否正在等待中断后延迟执行。
接下来,根据任务的状态进行相应的操作。如果任务是就绪状态,则修改优先级并重新插入到就绪列表中;如果任务是延迟、挂起等状态,则仅修改优先级;如果任务正在等待信号量、消息队列等,则根据等待的对象类型进行不同的操作。
最后,调用 OSSched 函数以重新调度任务。
OSTaskCreate
- 功能:创建一个新的任务。
- 参数:
p_tcb:指向任务控制块的指针。
p_name:任务的名称。
p_task:任务的入口函数。
p_arg:传递给任务入口函数的参数。
prio:任务的优先级。
p_stk_base:任务堆栈的基地址。
stk_limit:任务堆栈的限制。
stk_size:任务堆栈的大小。
q_size:消息队列的大小。
time_quanta:时间片大小。
p_ext:指向任务扩展数据的指针。
opt:任务选项。
p_err:返回错误类型的指针。 - 其他:
函数首先对参数进行检查,例如检查是否为 NULL,是否在中断上下文中等。
接下来,函数会初始化任务控制块和堆栈。
然后,设置任务的各种属性,例如任务名称、优先级、堆栈指针等。
最后,将任务插入到就绪列表中,并调用 OSSched 函数以启动任务调度。
OSTaskDel
- 功能:删除任务。
- 参数:
p_tcb:指向要删除的任务控制块的指针,如果为 NULL,则表示删除当前任务。
p_err:返回错误类型的指针。 - 其他:
函数首先进行一些安全性检查,例如检查是否处于中断上下文中,以及是否试图删除空闲任务。
接下来,根据任务的状态进行相应的操作。如果任务是就绪状态,则从就绪列表中移除;如果任务正在等待延迟、消息等,则取消相应的等待;最后,清理任务控制块,并调用任务删除的钩子函数。
最后,调用 OSSched 函数以重新调度任务。
OSTaskQFlush
- 功能:清空任务消息队列,并返回队列中消息的数量。
- 参数:
p_tcb:要清空消息队列的任务的指针。如果为 NULL,则表示清空当前任务的消息队列。
p_err:返回错误类型的指针。
返回值:返回清空的消息数量。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
如果在中断上下文中调用该函数,则返回错误。
函数首先检查是否要清空当前任务的消息队列,然后进入临界区,并调用 OS_MsgQFreeAll 函数清空任务消息队列。
最后,将错误设置为 OS_ERR_NONE,并返回清空的消息数量。
OSTaskQPend
- 功能:等待接收任务消息。
- 参数:
timeout:超时时间。
opt:等待选项。
p_msg_size:指向存储接收到的消息大小的变量的指针。
p_ts:指向存储时间戳的变量的指针。
p_err:返回错误类型的指针。
返回值:返回接收到的消息指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
如果在中断上下文中调用该函数,则返回错误。
函数首先对参数进行检查,例如检查传入的消息大小指针是否为空。
然后,根据等待选项和当前任务的状态进行相应的操作。如果消息队列中有消息,则从中获取消息并返回;如果没有消息,根据超时时间决定是否阻塞当前任务。
如果任务被阻塞,则将任务添加到挂起列表中,并调用调度器以寻找下一个最高优先级的任务。
最后,根据等待状态设置错误码,并返回接收到的消息指针。
OSTaskQPendAbort
- 功能:终止任务的消息队列等待。
- 参数:
p_tcb:要终止等待的任务的指针。
opt:终止选项。
p_err:返回错误类型的指针。
返回值:返回终止是否成功的布尔值。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
如果在中断上下文中调用该函数,则返回错误。
函数首先对参数进行检查,例如检查传入的任务指针是否为空。
然后,根据终止选项和当前任务的状态进行相应的操作。如果任务正在等待消息队列,则终止等待,并根据选项决定是否立即调度。
最后,设置错误码,并返回终止是否成功的布尔值。
OSTaskQPost
- 功能:向任务消息队列发送消息。
- 参数:
p_tcb:要发送消息的任务的指针。
p_void:指向要发送的消息的指针。
msg_size:消息的大小。
opt:发送选项。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先对参数进行检查,例如检查发送选项是否有效。
然后,获取当前时间戳,并根据是否在中断上下文中调用该函数决定如何处理发送消息。
如果不在中断上下文中,则直接调用 OS_TaskQPost 函数发送消息;如果在中断上下文中,则将消息放入中断队列中等待后续处理。
OSTaskRegGet
- 功能:获取任务的指定寄存器的值。
- 参数:
p_tcb:要获取寄存器值的任务的指针。如果为 NULL,则表示获取当前任务的寄存器值。
id:寄存器的 ID。
p_err:返回错误类型的指针。
返回值:返回指定寄存器的值。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查寄存器 ID 的有效性,然后进入临界区,获取任务指定寄存器的值,并将错误码设置为 OS_ERR_NONE。
OSTaskRegGetID
- 功能:获取可用的任务寄存器 ID。
- 参数:
p_err:返回错误类型的指针。
返回值:返回可用的任务寄存器 ID。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查是否还有可用的任务寄存器 ID,如果没有则返回错误码,并设置错误类型为 OS_ERR_NO_MORE_ID_AVAIL。
如果有可用的 ID,则获取下一个可用的 ID,并将错误码设置为 OS_ERR_NONE。
OSTaskRegSet
- 功能:设置任务的指定寄存器的值。
- 参数:
p_tcb:要设置寄存器值的任务的指针。如果为 NULL,则表示设置当前任务的寄存器值。
id:寄存器的 ID。
value:要设置的寄存器值。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查寄存器 ID 的有效性,然后进入临界区,设置任务指定寄存器的值,并将错误码设置为 OS_ERR_NONE。
OSTaskResume
- 功能:恢复被挂起的任务。
- 参数:
p_tcb:要恢复的任务的指针。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查是否在中断上下文中调用该函数,并根据情况返回相应的错误码。
然后进入临界区,检查传入的任务指针是否有效,如果无效则返回相应的错误码。
最后,调用 OS_TaskResume 函数恢复任务,并将错误码设置为 OS_ERR_NONE。
OSTaskSemPend
- 功能:等待一个任务信号量。
- 参数:
timeout:等待信号量的超时时间。
opt:等待选项,可以是阻塞或非阻塞。
p_ts:用于返回等待开始时的时间戳。
p_err:返回错误类型的指针。
返回值:如果成功等待到信号量,则返回剩余的信号量计数;如果超时或发生其他错误,则返回0。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查是否在中断上下文中调用该函数,然后验证选项的有效性。
如果任务已经被信号量激活,函数会减少信号量计数并返回剩余计数。
如果是非阻塞等待,并且信号量未可用,函数会立即返回,并设置错误码为 OS_ERR_PEND_WOULD_BLOCK。
如果是阻塞等待,会将任务挂起,并设置状态为等待信号量状态。
OSTaskSemPendAbort
- 功能:中止一个任务的信号量等待。
- 参数:
p_tcb:要中止等待的任务的指针。
opt:中止选项,可以是简单的中止或不调度中止。
p_err:返回错误类型的指针。
返回值:如果成功中止等待,则返回 DEF_TRUE;否则返回 DEF_FALSE。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先检查是否在中断上下文中调用该函数,然后验证选项的有效性。
如果任务正在等待信号量,函数会中止等待,并根据选项是否调度来执行相应的操作。
OSTaskSemPost
- 功能:发布一个任务信号量。
- 参数:
p_tcb:要发布信号量的任务的指针。
opt:发布选项,可以是简单的发布或不调度发布。
p_err:返回错误类型的指针。
返回值:返回发布后的信号量计数。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先验证选项的有效性,然后获取时间戳并调用 OS_TaskSemPost 函数发布信号量。
OSTaskSemSet
- 功能:设置任务的信号量计数。
- 参数:
p_tcb:要设置信号量计数的任务的指针。如果为 NULL,则表示设置当前任务的信号量计数。
cnt:要设置的信号量计数。
p_err:返回错误类型的指针。
返回值:返回设置之前的信号量计数。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先验证任务指针的有效性,然后进入临界区,设置任务的信号量计数,并将错误码设置为 OS_ERR_NONE。
OSTaskStkChk
- 功能:检查任务堆栈的空闲空间和已使用空间。
- 参数:
p_tcb:要检查的任务的指针。如果为 NULL,则表示检查当前任务的堆栈。
p_free:返回空闲堆栈空间的指针。
p_used:返回已使用堆栈空间的指针。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
函数首先验证是否在中断上下文中调用该函数,并验证参数的有效性。
然后计算任务堆栈的空闲空间和已使用空间,并将结果存储在传入的指针中。
OSTaskSuspend
- 功能:挂起一个任务。
- 参数:
p_tcb:要挂起的任务的指针。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
首先检查是否在中断上下文中调用该函数,然后确保不会挂起空闲任务或中断处理任务。
如果在中断上下文中调用该函数,则将挂起任务的请求放入中断服务请求队列中,以便在适当的时候处理。
否则,直接调用 OS_TaskSuspend 函数挂起任务。
OSTaskTimeQuantaSet
- 功能:设置任务的时间片大小。
- 参数:
p_tcb:要设置时间片的任务的指针。如果为 NULL,则表示设置当前任务的时间片。
time_quanta:时间片大小。
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
首先检查是否在中断上下文中调用该函数,然后设置任务的时间片大小。
OS_TaskDbgListAdd 和 OS_TaskDbgListRemove
- 功能:添加和移除任务的调试列表。
- 参数:
p_tcb:要添加或移除的任务的指针。 - 其他:
OS_TaskDbgListAdd 用于将任务添加到调试列表中,而 OS_TaskDbgListRemove 用于将任务从调试列表中移除。
OS_TaskInit
- 功能:初始化任务管理器。
- 参数:
p_err:返回错误类型的指针。 - 其他:
如果安全性检查使能,并且传入的错误指针为空,则会引发异常。
主要用于清除任务数量和上下文切换计数,并将错误码设置为 OS_ERR_NONE。
OS_TaskInitTCB
- 功能:初始化任务控制块(TCB)。
参数**:**
p_tcb:要初始化的任务的 TCB 指针。 - 其他:
用于初始化任务控制块中的各种字段,包括堆栈指针、扩展指针、任务名字、优先级、状态等。
OS_TaskQPost
- 功能:向任务的消息队列中发送消息。
- 参数:
p_tcb:要发送消息的任务的指针。如果为 NULL,则表示发送消息给当前任务。
p_void:指向要发送的消息的指针。
msg_size:消息的大小。
opt:发送消息的选项。
ts:时间戳。
p_err:返回错误类型的指针。 - 其他:
如果 p_tcb 为 NULL,则消息发送给当前任务。
根据任务的状态,将消息放入任务的消息队列中,或者如果任务在等待消息,则直接将消息发送给任务,并根据需要调度任务。
OS_TaskResume
- 功能:恢复被挂起的任务。
- 参数:
p_tcb:要恢复的任务的指针。
p_err:返回错误类型的指针。 - 其他:
根据任务的状态,将任务从挂起状态恢复到就绪状态,并根据需要调度任务。
OS_TaskReturn
- 功能:任务返回函数,用于删除任务或者在任务不支持删除时使任务无限循环延迟。
- 参数:无。
- 其他:
调用用户定义的任务返回钩子函数。
如果任务删除功能使能,则删除任务;否则,任务进入无限循环延迟状态。
OS_TaskSemPost
- 功能:向任务发送信号量。
- 参数:
p_tcb:要发送信号量的任务的指针。如果为 NULL,则表示发送信号量给当前任务。
opt:发送信号量的选项。
ts:时间戳。
p_err:返回错误类型的指针。
返回值:返回任务的信号量计数器值。 - 其他:
如果 p_tcb 为 NULL,则信号量发送给当前任务。
根据任务的状态,将信号量发送给任务或者直接给任务发送信号量,并根据需要调度任务。
OS_TaskSuspend
- 功能:挂起任务。
- 参数:
p_tcb:要挂起的任务的指针。如果为 NULL,则表示挂起当前任务。
p_err:返回错误类型的指针。 - 其他:
如果 p_tcb 为 NULL,则挂起当前任务。
根据任务的状态,将任务挂起,并根据需要调度任务。