
1、任务
1.1、任务创建
- 任务自启动参数:
内核提供的任务创建接口,会存在参数指定当前任务创建完立即运行还是需要显示调用start运行,需要注意。如果在创建任务时指定了立即执行,而在创建任务后去设置任务参数,可能是不生效的。(尤其posix的pthread接口经常遇到这种问题)
- 任务的栈参数:
任务的栈大小是由用户来指定的,一定要确认开栈大小是否满足自身需求。OS虽然有栈溢出检测,但是不是100%能检测出来的。引起的问题会非常混乱。
1.2、任务的调度策略
目前rhino内核提供的几种调度策略包括:
- 优先级;
- RR时间片;
- CFS公平调度
需要注意的是,在前两种调度的任务中,如果用户任务内在死循环,且没有主动退出的动作,如sleep或者其他Pend动作,那这个任务会一直运行,直到中断的到来,才可能切换到更高优先级的任务,且低优先级任务永远无法运行。
1.3、任务和中断关联
任务执行中,如果不关中断,中断会随时打断任务上下文现场;
中断退出时,会发生任务调度,可能会有任务切换。
1.4、任务退出
需要关注的是,用户的任务处理函数内结束后,任务即会自动退出;
不需要用户手动调用删除任务接口;
也不能在任务自己退出后,还在使用任务的资源;
2、内存
2.1、内存空间管理
内存的堆一般是在ld链接脚本中预留的,通过固定的数据结构告诉OS。
链接脚本中定义堆空间:
PROVIDE (heap_start = __stack); //end of stack
heap_end = ORIGIN(RAM) + LENGTH(RAM);
PROVIDE (heap_len = heap_end - heap_start);
堆的起点heap_start定义为栈的结尾,堆的结尾heap_end定义为RAM的结尾,这样剩余RAM的空间都交给OS管理。
对应的krhino的堆空间初始化为:
k_mm_region_t g_mm_region[] = {
{(uint8_t *) &heap_start, (size_t) &heap_len}};
注意:这段内存分配给堆使用,并不是表示内存都耗尽了,而是将其交给OS管理,用户通过malloc出来的内存都是从其中申请。

本文深入讲解RTOS中的关键机制,包括任务管理、内存管理、中断处理等,并探讨了多核环境下的扩展性和同步机制。
最低0.47元/天 解锁文章
2124

被折叠的 条评论
为什么被折叠?



