您的位置:首页 > 编程语言

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 event



The battery timer expires



不使用调度的事件流示意

Receiving an event from the ble stack causing a service event



The battery timer expires]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: