Skip to content

aCoral Technical Reference Manual

spg edited this page Mar 31, 2024 · 15 revisions

1. 启动

对于不同的SOC,上电之后的启动流程各不相同,因此本仓库中并没有SOC上电之后最初的启动代码(一般常见的名称包括start.S、crt.S等),这部分代码由SOC的厂商提供。最初的上电启动代码中应包含时钟初始化、存储器初始化、堆栈初始化、串口初始化、等bootloader的基本内容,最后跳转到aCoral内核中kernel/core.cacoral_start()函数。

void acoral_start()
{
	ACORAL_LOG_TRACE("Kernel Module Init Start!\n");

	/*内核模块初始化*/
	acoral_module_init();

	/*主cpu开始函数*/
	acoral_core_cpu_start();
}
  • acoral_module_init()就是对内核模块中的线程管理、线程交互、内存管理、中断管理四个子模块进行初始化;
  • acoral_core_cpu_start()中会创建init、idle、daem三个最基础的线程,分别用于系统初始化、系统空转、线程回收,最后开启系统调度器,并切换到init、idle、daem三个中优先级最高的init线程,从此一去不返...

2. 资源管理

aCoral使用面向对象编程的思想,将操作系统内核中常用的数据结构抽象为资源。 资源池控制块和资源池本身都是静态资源,不是从malloc动态分配的。

4. 线程管理

4.1 线程数据结构

4.1.1 TCB

4.1.2 线程状态

  • ACORAL_THREAD_STATE_EXIT

    表示线程已经执行完毕,但是还不能被daem线程释放。这个状态是针对多核系统的,单核系统没啥用。考虑如下场景:假设核0线程A执行完毕,进入ACORAL_THREAD_STATE_EXIT状态,并被加入acoral_res_release_queue队列,但是还没有切换到下一个线程,此时核1的daem线程访问acoral_res_release_queue队列,直接把线程A释放了,线程A的TCB、堆栈都没了,那核0上的线程A就没法切换到下一个线程了,因为线程切换过程acoral_real_sched会用到旧线程A的TCB和堆栈,现在没了,怎么切换?

  • ACORAL_THREAD_STATE_RELEASE

    表示线程在变成ACORAL_THREAD_STATE_EXIT状态之后,已经被切换了,此时线程的TCB、堆栈都没用了,可以被daem线程释放。

2.2 线程管理接口

Clone this wiki locally