nrf51822代码阅读笔记二
2018-02-09 11:29
706 查看
Scheduler
51822的调度,先建个目录,后续在补详细的源码分析,主要是参考官方的库函数说明,可以说是大概的翻译吧,原文的链接地址如下:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v13.0.0%2Fgroup__app__scheduler.html
调度器的使用目的
nrf的官方给的说明文档中说,调度器是为了让程序有中断切换到正式运行的程序中。主要是用于软timer实现的中断,对于硬中断,包含IO口的中断,可以在初始化的时候选择是否启用调度器。调度的初始化
uint32_t app_sched_init ( uint16_t max_event_size,uint16_t queue_size,void * p_evt_buffer )
官方的库中给了调度初始化的函数。必须在进入主函数之前调用初始化函数,才能启动调度器。
max_event_size
max_event_size 指定了最大的事件大小。
queue_size
queue_size 指定了调度队列中最大的数目。
p_evt_buffer
p_evt_buffer指向用于存放调度程序队列的内存缓冲区的指针。 它必须使用APP_SCHED_BUFFER_SIZE()宏进行标注。 缓冲区必须与4字节的边界对齐。
APP_SCHED_INIT
其建议使用宏 APP_SCHED_INIT 来进行初始化,可以保证分配到调度的缓冲区,并且可以4字节对齐。
下面是APP_SCHED_INIT的实现:
do \ { \ static uint32_t APP_SCHED_BUF[CEIL_DIV(APP_SCHED_BUF_SIZE((EVENT_SIZE), (QUEUE_SIZE)), \ sizeof(uint32_t))]; \ uint32_t ERR_CODE = app_sched_init((EVENT_SIZE), (QUEUE_SIZE), APP_SCHED_BUF); \ APP_ERROR_CHECK(ERR_CODE); \ } while (0)
上一篇文章解析了CEIL_DIV函数,其可以保证4字节对齐。其申请的调取器的buf空间APP_SCHED_BUF存在静态区,并且可以4个字节对齐,在程序结束的时候释放。
调度的暂停和恢复
nodic 官方提供了调度没得暂停和恢复函数。void app_sched_pause ( void ) void app_sched_resume ( void )
app_sched_pause 和 app_sched_resume 分别可以暂停地调度和将调度从暂停中恢复。两个函数可重复调用,但必须成对出现。在使用使用需要势能宏APP_SCHEDULER_WITH_PAUSE 启用调度的暂停功能。
获取调度队列的空闲空间
uint16_t app_sched_queue_space_get
如果从中断中添加调度时,此时可以先检查下队列的剩余空间。
observed queue utilization
uint16_t app_sched_queue_utilization_get ( void )
获取队列的利用率。注意调用的时候需要先势能宏APP_SCHEDULER_WITH_PROFILER. Enabling scheduler profiling,启用调度分析。
将一个事件放入调度队列
uint32_t app_sched_event_put ( void * p_event_data,uint16_t event_size,app_sched_event_handler_t handler )
[in] p_event_data Pointer to event data to be scheduled.
指针指向需要调度数据的地址。
[in] event_size Size of event data to be scheduled.
放入调度的数据大小。
[in] handler Event handler to receive the event.
调度的处理函数。
开始事件调度
void app_sched_execute (void)
调度的事件流示意
Receiving an event from the ble stack causing a service eventThe battery timer expires
不使用调度的事件流示意
Receiving an event from the ble stack causing a service eventThe battery timer expires]
相关文章推荐
- nrf51822代码阅读笔记三
- 梦断代码阅读笔记02
- 广播机制(Broadcast Receiver)——第一行代码阅读笔记
- Cocos2d-JS 2017.1.18-代码阅读笔记
- 梦断代码阅读笔记01
- ijkplayer阅读学习笔记之从代码上看播放流程
- Discuz!NT代码阅读笔记(6)--从全局看看:各个模块功能摘要(2)
- MySQL代码阅读笔记之代码编译调试
- 梦断代码阅读笔记之三
- 梦断代码阅读笔记之一
- 第一行代码阅读笔记----显示隐式Intent的基本用法
- 梦断代码阅读笔记之一
- <<梦断代码>>阅读笔记一
- Linux协议栈代码阅读笔记(二)网络接口的配置
- [置顶] Linux协议栈代码阅读笔记(二)网络接口的配置
- 深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer
- linux源代码阅读笔记 get_free_page()代码分析
- Android代码阅读笔记——智能指针
- gmf logic example 代码阅读笔记
- 代码大全第二版阅读笔记