UCOS-III使用的47个知识点!

judy的头像
judy 发布于:周三, 01/10/2018 - 17:47 ,关键词:

1、uC/OS-III其中最有用的功能应该是时间片轮转法( roundrobin), 这个是 uC/OS-II 中不支持的,但是现在已经是 uC/OS-III 的一个功能了。

2、uC/OS-III 被设计用于 32 位处理器, 但是它也能在 16 位或 8 位处理器中很好地工作。

3、一共有 2 种类型的实时系统:软实时系统和硬实时系统。硬实时系统中,运算超时是不允许发生的,运算超时会导致严重后果。但是在软实时系统中 , 超时不会导致严重后果

4、前后台系统:包含一个无限循环的模块实现需要的操作(后台)。中断处理程序实现异步事件(前台)。前台也叫做中断级,后台也叫作任务级。

5、临界操作应该在任务级中被执行,不可避免地必须在中断处理程序中执行也要确保是在很短的时间内完成。 因为这会导致 ISR 占用更长的时间。 通常的, ISR 中使能相关的信息而在后台程序中执行相应的操作。

6、ucos-iii中的任务(也叫做线程) 是一段简单的程序, 运行时完全地占用 CPU 。在单 CPU 中,任何时候只有 1 个任务被执行。

7、内核的责任是管理任务,协调和切换多个任务依次享用 CPU 。让我们感觉是多个 CPU 在同时运行,也有利于处理模块化的应用 它也负责管理任务间的交流, 系统资源的管理(内存 和I/O )等。

8、uC/OS-III 是一个抢占式内核, 这意味着 uC/OS-III 总是执行最重要的就绪任务。

9、ISR 响应中断请求设备, 但是 ISR 只做非常少的工作。 ISR应该标记或发送消息到一个高优先级的任务, 让中断能够快速处理完毕。

10、系统中加入内核需要额外的支出,因为内核提供服务时需要时间去处理。内核占用 CPU 的时间介于 2% 到 4% 之间。 因为 uC/OS-III是一个软件,添加到目标系统中需要额外的 ROM 和 RAM 。

11、。 uC/OS-III 内核需要 1K 到 4K 之间的 RAM , 加上每个任务自己所需的堆栈空间。 至少有 4K 大小 RAM 的处理器才有可能成功移植 uC/OS-III 。

12、: uC/OS-III 允许多个任务拥有相同的优先级。 当多个相同优先级的任务就绪时, 并且这个优先级是目前最高的uC/OS-III 会分配用户定义的时间片给每个任务去运行。 每个任务可以定义不同的时间片 。

13、uC/OS-III 保护临界段可以通过锁定调度器代替关中断。 因此关中断的时间会非常少。这样就使 uC/OS-III 可以响应一些非常快的中断源了。

14、 uC/OS-III 允许用户在运行时配置内核。特别的,所有的内核对象如任务、堆栈、信号量、事件标志组、消息队列、 消息、 互斥信号量、内存分区、 软件定时器等都是在运行时分配的 , 以免在编译时的过度分配。

15、uC/OS-III 对任务数量、任务大小、优先级数量无限制。每一个任务需要有自己的堆栈空间。实际上, 任务的数量和大小限制于处理器能提供的内存大小。

16、uC/OS-III 支持任何数量的任务、信号量、 互斥信号量、 事件标志组、 消息队列、 软件定时器、 内存分区。 用户在运行时分配所有的内核对象。

17、互斥信号量用于资源管理。它是一个内置优先级的特殊类型信号量, 用于消除优先级反转。 互斥信号量可以被嵌套,因此,任务可申请同一个互斥信号量多达 250 次。当然, 互斥信号量的占有者需要释放同等次数。

18、: uC/OS-III 允许任务停止自身或者停止另外的任务。 停止一个任务意味着这个任务将不再执行直到被其他的任务复。 停止可以被嵌套到 250 级。换句话说, 一个任务可以停止另外的任务多达 250 次。 当然, 这个任务必须被恢复同等次数才有资格再次获得 CPU 。

19、可以定义任意数量的一次性的、周期性的、或者两者兼有的软件定时器。 定时器是倒计时的, 执行用户定义的行为一直到计数减为 0 。 每一个定时器可以有自己的行为, 如果一个定时器是周期性的,计数减为 0 时会自动重装计数值并执行用户定义的行为。

20、: uC/OS-III 允许任务等待多个事件的发生。等待中的任务在所有事件发生后被唤醒

21、 uC/OS-III 允许 ISR 或者任务直接地发送信号量给其它任务。 这样就避免了必须产生一个中间级内核对象如一个信号量或者事件标志组只为了标记一个任务。提高了内核性能。

22、:每一个任务可以拥有用户可定义的任务寄存器,不同于 CPU 寄存器。uC/OS-III 能检测指针是否为 NULL 、 在 ISR 中调用的任务级服务是否允许、参数在允许范围内、 配置选项的有效性、 函数的执行结果等。每一个 uC/OS-III 的 API 函数返回一个对应于函数调用结果的错误代号。

23: uC/OS-III 有内置性能测量功能。 能测量每一个任务的执行时间 , 每个任务的堆栈使用情况, 任务的执行次数, CPU的使用情况, ISR 到任务的切换时间 , 任务到任务的切换时间, 列表中的对象的峰值数,关中断、锁调度器平均时间等。

24 、uC/OS-III 被设计于能够根 CPU 的架构被优化 uC/OS-III 所用的大部分数据类型能够被改变, 以更好地适应 CPU 固有的字大小。 优先级调度法则可以通过编写一些汇编语言而获益于一些 特 殊 的 指令如位设置、位清除、计数器清零指令( CLZ )、find-first-one(FF1) 指令。

25、uC/OS-III 中所有的挂起服务都可以有时间限制, 预防死锁。

26、uC/OS-III 有时基任务, 时基 ISR 触发时基任务。 uC/OS-III 使27、uC/OS-III使用了哈希列表结构, 可以大大减少处理延时和任务超时所产生的开支。

28、uC/OS-III 允许程序员定义 hook 函数。hook 函数允许用户扩展 uC/OS-III 的功能。

29、为了测量时间, uC/OS-III 需要一个 16 位或者 32 位的时时间戳计数器。

30、 每个 uC/OS-III 的内核对象有一个相关联的名字。 这样就能很容易的识别出对象所指定的作用。对象的名字长度没有限制,但是必须以空字符结束。

31、每个任务需要创建自己的堆栈。 堆栈的数据类型 CPU_STK 。堆栈可以被静态地分配或者通过 malloc() 动态地分配。若任务将不会被删除,堆栈将一直被使用。

32、在大部分处理器中, 中断在启动时是关闭的。 无论如何, 在启动时关闭所有的外设中断是最安全的。

33、uC/OS-III 须创建空闲任务 OS_IdleTask (), 当没有其他任务运行时就运行空闲任务。根 据 配 置 文 件 中 所 uC/OS-III 会 创 建 统 务OS_StatTask() 、定 时 器任务 OS_TmrTask() 、 中 断队 列 处 理任务OS_IntQTask() 。

34、 OSTaskCreate() 的第四个参数, 第一次被调用时OSTaskCreate() 接收这个变量, 传递给所创建的任务中的唯一参数"p_arg"。该参数可以是任意类型的指针。

35、参数值越小优先级越高。 可以设置优先级数值为 1 到 OS_CFG_PRIO_MAX-2 。 要避免使用优先级 #0 和优先级OS_CFG_PRIO_MAX-1 。 因 为 这些是为 uC/OS-III保留的。

36、任务的堆栈大 ( 以 CPU_STK 为数据类型而不是字节 ) 。 例如, 如果要分配 1KB 大小的堆栈空间,因为 CPU_STK 是 32 位的,所以这个其值为 256.

37、)所有的 uC/OS-III 任务需要被设置为无限循环。

38、互斥信号量( mutex )是一个内核对象,用于保护共享资源。 任务要访问共享资源就必须先获得 mutex 。mutex的拥有者使用完这个资源后就必须释放这个 mutex 。

39、消息队列是一个内核对象, ISR 或任务可以直接发送消息到另一个任务。 发送者制定一个消息并将其发送到目标任务的消息 队列。 目标任务等待消息的到达。

40、定义消息队列可接受消息的个数。 这个值必须大于 0 。如果消息者发送消息数超过了消息接收任务的承受能力。那么消息将会被丢失。可以通过增加消息队列的大小或者提供消息接收任务的优先级提升其承受能力。

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、在嵌入式系统中动态地分配堆栈是被允许的,但是,一旦堆栈被动态分配,它就不能被回收。换句话说, 对于有些不需要被删除的任务, 动态分配它们的堆栈是一种很好的解决方法。

摘自:http://www.cnblogs.com/steed/p/7873794.html

围观 730