uc-osII系统移植

任务调度
ucosii 为保证实时性,给每个任务分配一个不同的优先级。当发生任务切换时,
总是切换到就绪的最高优先级任务。有 2 种情况会发生任务切换。
1.任务等待资源就绪或自我延时;
2.退出中断;
情况 1 可以理解为任务主动放弃 cpu 的使用权。
情况 2 可以理解为中断后,某种资源可能就绪了,需要任务切换。
需要注意的是 SysTick 中断,这个中断是 os 的“心跳”,必须得有。这样就使得
cpu 会发生周期性地做任务切换。由于 ucosii 不支持时间片轮转调度,因此在该中
断中必须做的工作仅有 os 的时间管理。也就是调用 OSTimeTick()。
任务同步
任务同步和大多数操作系统的做法差不多,如果学过操作系统或是有多线程编
程经验的话,应该很好理解。无非是任务 A 因为某个资源未就绪,就放弃 cpu 使用
权,等任务 B 或是中断使该资源就绪,当再次任务进行切换时如果任务 A 优先级最
高,则任务 A 继续执行。具体怎么实现就看邵老师的书吧。
内存管理
ucosii 的内存管理比较简单,就不说了。
下面看看 ucosii 代码组成:
os_core.c 是 ucosii 的核心,它包含了内核初始化,任务切换,事件块管理等,
其中事件块是各个同步量(这里我把互斥量,信号量,邮箱,队列统称为同步量,
不是很科学,图个方便。事件标志组不是以事件块为基础的,不过原理也差不多)
的基础。
os_task.c
任务管理代码。
os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
各个同步量管理代码。
os_mem.c 内存管理代码。
os_time.c
时间管理代码,主要做各种延时。
os_tmr.c
定时器管理代码,这部分代码时从 V2.81 版才开始有的,邵老师的书讲的是
V2.55 版的代码,是没有这部分内容的。如果前面的代码都理解的话,这部分代码
也是不难理解的。一个定时器大体由 3 部分组成:定时时间,回调函数和属性。当
定时时间到了的话,就进行一次回调函数的处理,定时器属性说明定时器是周期性
的定时还是只做一次定时。如果用户使能了 OS_TMR_EN,ucosii 会在内部创建一
个定时器任务,负责处理各个定时器。这个任务一般应该由硬件定时器的中断函数
中调用 OSTmrSignal()去激活。所以从本质上说 os_tmr.c 中的定时器是由一个硬件
定时器分化出来的。
默认情况下是由 SysTick 中断里通过 OSTimeTickHook()去激活定时器任务的。
移植相关文件
os_cpu.h: 进行数据类型定义,处理器相关代码和几个函数原型。
os_cpu_c.c: 定义一些用户 hook 函数。
os_cpu_a.asm: 移植需要用汇编代码完成的函数,主要就是任务切换函数。
os_dbg.c: 内核调试相关数据和函数,可以不改。
ucosii 内核就介绍到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值