uCOS-III 知识点总结三
41、uC/OS-III 定义了一个进入临界段的宏和两个出临界段的宏(退出临界段后是否调用调度器)。
42、测得消息是什么时候被发送的, 用户就能测得任务接收这个消息所用的时间。 读取现在的时间戳并减去消息被发送时的时戳。需注意的是, 消息被发送时, 等待消息的任务可能不会立即接收到消息,因为 ISR 或更高优先级的任务可能抢占了当前任务。显然,测出的时间还包括了测量时消耗的额外时间。 然而减掉测量时所耗时间就是实际上的时间。
43、时间戳的控制单元位于 CPU_TS 中。 例如, 如果 CPU 速率为 1MHz , 时间戳的速率为 1MHz 。 那么CPU_TS 的分辨率为 1 微秒
44、当任务第一次执行时, 会传入一个变量 "p_arg" 。这是一个指向 void的指针。 用于变量的地址、 结构体地址、 或者函数的地址等。 如果需要,可以创建多个相同的任务,使用相同的代码(相同任务体),而产生有不同的运行结果。
45、只运行一次的任务结束时必须通过调用 OSTaskDel() 删除自己。 这样可以使系统中的任务数减少。
46、一个任务可以创建其它任务( 调 OSTaskCreate() )、 停止或者恢复其它 ( 调用 OSTaskSuspned() 和 OSTaskResume()) 、 提交信号量到其它任务、 发送消息到其它任务、 提供共享资源等。 换句话说, 任务不是只被限制于“等待事件”。
47、在嵌入式系统中动态地分配堆栈是被允许的,但是,一旦堆栈被动态分配,它就不能被回收。 换句话说, 对于有些不需要被删除的任务, 动态分配它们的堆栈是一种很好的解决方法。
48、可以人工地计算出任务需要的堆栈空间大小,逐级嵌套所有可能被调用的函数, 添加被调用函数中所有的参数, 添加上下文切换时的CPU 寄存器空间, 添加切换到中断时所需的 CPU 寄存器空间,添加处理 ISRs 所需的堆栈空间。 把上述的全部相加, 得到的值定义为最小的需求空间。 因为我们不可能计算出精确的堆栈空间。 通常是再乘以 1.5 以确保任务的安全运行。
49、另一种防止堆栈溢出的方法是分配的空间远大于可能需要的。 首先, 当任务创建时其堆栈被清零。 程序运行一段时间后,通过一个低优先级任务, 计算该任务整个堆栈中值为 0 的内存大小。 这是一种非常有效的方法。 注意的是, 程序需用运行很长的时间以让堆栈达到其需要的最大值。
50、从用户的观点来看,任务可以是有 5 种状态,休眠状态,就绪状态,运行状态,挂起状态,中断状态 。
51、调用 OSTaskSuspend() 会任务无条件地停止运行。 有些时候调用 OSTaskSuspend() 不是为了等待某个事件的发生,而是等待另一个任务调用 OSTaskResume() 函数恢复这个任务。
52、任务控制块是被 uC/OS-III 用于维护任务的一个结构体。 每个任务都必须有自的己 TCB 。TCB 中的一些变量可以根据具体应用进行裁剪。用户程序不应该访问这些变量(尤其不能更改它们)
53、有些处理器有硬件寄存器可以自动地检测并确保堆栈不发生溢出, 如果处理器没有这些硬件施,ucos-iii的堆栈检测可以用软件模拟。 然而, 软件模拟不如硬件可靠。
54、在 uC/OS-III 初始化的时候,它会创建至少 2 个内部的任务 (OS_IdleTask() 和 OS_TickTask()) , 3 个可选择的任务( OS_StatTask() ,OS_TmrTaks() , OS_IntQTask() )。这些可选择的任务在编译时由OS_CFG.H 中的配置决定。
55、当 CPU 中没有其它就绪任务运行时,空闲会被运行。空闲任务是一个无限循环的不会等待任何事件的任务。空闲任务的每次循环,都会调用 OSIdleTaskHook() 函数,这个函数提供给用户扩展应用,如让处理器进入低功耗模式等。
56、使用硬件定时器并被设置为以 10 到 1000Hz 之间的频率产生时基中断,时基中断并不是一定要用 CPU 产生, 事实上, 它可以从其他的具有较精确的周期性时间源中获得,比如电源线( 50-60Hz )等。
57、当时基任务执行时,它会遍历挂起队列中所有等待期满的任务或等待事件超时的任务。 它会就绪时基列表中的那些期满、超时的任务。使用轮转法遍历队列(此队列为二维数组的形式)大大减少了遍历队列所占用CPU的时间。
58、统计任务能够统计总的 CPU 使用率, 每个任务的 CPU使用率,每个任务的堆栈使用量。
59、软件定时器通常需要的频率可由用户设置, 通过软件将时基分频。 换句话说如果时基速率为 1000Hz, 但是想要的定时器速率为 10Hz, 软件定时器任务会每 100 个时基被标记一次。时基任务的优先级要高于定时器任务,定时器任务的优先级需要于统计任务
60、当一个任务创建了一个具有相同优先级的任务,这个新任务会被添加到该优先级队列的尾部(因为具有相同优先级情况下, 没有理由让新任务先运行)。然而,当一个任务创建了一个具有不同优先级的任务时,这个新的任务就会放到对应优先级列表中的首部。注意:正在运行的任务也被放在就绪列表中。