1. CC254x的软件基于OSAL架构
2. OSAL并非一个真的操作系统, 而只是让软件设立一个事件的执行方法(setup excution of events)
3. 每一个子系统都在OSAL的一个任务(task)执行并由一个独立的task id.
4. task id越小, 优先级别越高
5. SimpleBLEPeripheral项目有12个任务: Link Layer, HAL, OSAL Callback Timer, L2CAP, GATT, GAP, SM, Peripheral Role Profile, GAP Bond Manager, GATT server, SimpleBLEPeripheral.
6. 每个任务由两个函数(function): 初始化, 比如SimpleBLEPeripheral_Init(), 跟事件处理, 比如SimpleBLEPeripheral_ProcessEvent();
7. 每个应用程序都要包含一个void osalInitTask(void)函数
8. 这个函数会调用每个任务的初始化函数来初始化任务.
9. 每个应用程序都要使用一个叫tasksArr的数组, 包含每个任务处理函数的指针.
10. 数组的顺序必须跟task ID的顺序一致.
11. 应用程序还应该产生一个名为tasksEvents的全局变量, 用uint16来对应每一个发生的task event, 对应的位置1标示发生了特定的event
12. 一个OSAL event事件是一个将来执行的task的标志
13. 每一个OSAL任务可以定义多达15个event
14. 两个方法设置event:
a: osal_set_event(), 立即设置一个event
b: osal_start_timeEX(), 安排若干时间(以ms为单位)后发生一个event, 可通过osal_stop_timeEX来取消.
15.看下面的图就明白了, 每个task有15个标志位去标志每一个event是否发生.
主循环:
1. 当osal_system_start被执行后, OSAL会进入主循环
2. 在循环中, 会不断检查taskEvents数组是否有位被置1, 如果有不同的task被发现有event需要处理, 则先处理task id优先级高的.
3. OSAL会用event处理指针的方法去处理对应的event
4. 当event处理方法执行完, 应该讲对应的event标示位置0, 不然这个方法会被重复执行.
5. 如果没有任务需要执行, OSAL会进入省电模式(power saving mode), 但是内存依然有电, 而且计时器也在持续运行.
6. 当中断发生时, 或者OSAL计数器定义的倒数时间到了, 处理器会被唤醒.
消息处理:
1. OSAL提供了消息处理机制来让不同的子系统之间传递数据.
2. 消息可以是任意类型数据, 任意长度.
3. 发送消息的程序是:
a: 用osal_msg_allocate()分配内存
b: 将数据拷贝进内存
c: 使用osal_msg_send()指定目标任务
4. 任务利用SYS_EVENT_MSG标示来发现待处理的消息
5. simpleBLEPeripheral_ProcessOSALMsg()函数来处理消息.
6. 收到消息后要用osal_msg_deallocate()来释放内存.
内存管理
1. OSAL API使用内存管理的函数是: osal_mem_alloc与osal_mem_free
2. 堆的尺寸在IAR的compiler里面设置
3. 如果堆尺寸设置得太高, CC2540可能会内存泄露.
4. 确认编译完成后, map文件不能超过8KB限制.
文件与关键的API
1. 关键文件包括: osal.c, osal.h
2. 关键api是:
osal_init_system();
osal_start_system();
osal_set_event();
osal_start_timeEX();
osal_stop_timeEX();
osal_msg_allocate();
osal_msg_send();
osal_msg_deallocate();
osal_mem_alloc();
osal_mem_free)();
3. OsalInitTask()是用来设置任务ID的.
硬件抽象层(HAL)
硬件抽象层包括对ADC, UART, SPI, Flash, Timer, Key, LCD驱动的接口