zoukankan      html  css  js  c++  java
  • OSAL

    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驱动的接口

  • 相关阅读:
    CF225E Unsolvable
    CF1100E Andrew and Taxi
    oracle数据库导入导出方法
    ORACLE无法删除当前连接用户
     为什么上传文件的表单里要加个属性enctype----摘录
    ecplise 使用快捷键
    spring工作机制及为什么要用?
    阐述struts2的执行流程。
    Hibernate工作原理及为什么要用?
    Mybatis 如何自动生成bean dao xml 配置文件 generatorconfig.xml (main()方法自动生成更快捷)
  • 原文地址:https://www.cnblogs.com/Montauk/p/5531233.html
Copyright © 2011-2022 走看看