结合AliOS Things谈嵌入式系统通用问题定位方法(2):内核相关基础

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

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出来的内存都是从其中申请。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值