Skip to content

aCoral Development Rules

spg edited this page Apr 2, 2024 · 10 revisions

1. aCoral设计理念

1.1 架构设计

aCoral由内核模块和外围模块组成,其中内核模块对应于kernel文件夹以及hal文件夹,外围模块对应driver文件夹和plugin文件夹,除此以外,user文件夹作为上层应用,也被放在aCoral源码中。aCoral的设计理念中,这些文件夹是分层的,其架构图如图所示

aCoral-architecture

分层设计理念中,上层需要通过下层提供的接口来访问更低级别的功能,而下层不能访问上层,例如:

  • kernel需要访问hal层,则必须通过hal或HAL开头的接口。这只需要#include "hal.h"即可
  • hal文件夹中需要使用kernel中的内容(函数、变量),则需要以参数的形式传入,这是为了保证在下层中,不包含上层的头文件。例如,在hal_timer_init()函数中,需要使用acoral_ticks_entry()函数来初始化定时器,此时不能直接在hal_timer_init中使用acoral_ticks_entry,而必须通过hal_timer_init的参数,将acoral_ticks_entry函数的指针以参数形式传进来使用。

这样分层的设计理念,可以尽可能降低上下层之间的耦合度。

1.2 面向对象

aCoral内核将所有管理的对象抽象为资源(resource),包括线程控制块TCB、事件(event,包括信号量和互斥量)、消息队列、驱动控制块等,即万物皆资源。这点类似于RT-THREAD中的Object概念,都属于面向对象的编程思想。

1.3 实时系统

aCoral的实时性通过实时调度策略、快速资源管理、快速中断管理三个方面来维护

1.3.1 实时调度策略

1.3.2 快速资源管理

aCoral对于资源的管理采取的策略为:

  • 分配时尽量快速:为了快速寻找到可以分配的资源,维护第一个可分配资源的指针,例如为了快速找到资源池控制块下第一个有空闲资源的资源池,在资源池控制块内维护free_pools指针;为了快速找到资源池中第一个可分配的资源,在资源池中维护res_free指针。以创建线程acoral_create_thread()为例,为了获得TCB资源,会调用acoral_get_res(),在里面会先通过pool_ctrl->free_pools->next获得第一个有空闲资源的资源池,再通过pool->res_free拿到该资源池上第一个空闲资源,并将该资源返回。
  • 回收交给daem线程,空时再做:删除线程,回收TCB的操作放在daem线程中进行,即系统中没有其他高优先级任务,系统处于比较空的状态,此时来回收TCB,完成更新free_pools、res_free指针等复杂操作,可以有效利用空闲时间,提高系统的实时性。

可以发现,所有获取的操作都是O(1)复杂度,并不需要去遍历某个链表或者数组获得第一个空闲的对象。这种获取操作时间上的便利是通过释放资源时增加复杂度的代价得到的。

2. aCoral设计规范

  • kernel文件夹中的代码提供了aCoral最核心的内核机制,不应该轻易修改。如果需要针对特殊应用场景,新增机制,请在lib文件夹中进行开发。
  • hal文件夹中,不同的SOC放在不同的文件夹中。

3. aCoral代码编写规范

3.1 头文件

  • 每个头文件用#ifndef包裹,以xxx.h为例:
#ifndef ACORAL_XXX_H
#define ACORAL_XXX_H
......
#endif
  • kernel层头文件请直接使用hal.h,不要去单独使用hal文件夹里面的头文件

3.2 源文件

  • API以"acoral_"开头,非API函数如果重要的话,以system_开头
  • 非API且仅在本源文件内使用的函数,加上static修饰,并且不要在头文件内声明该函数,注释也直接写在源文件函数上