- 目的
了解app_scheduler的用法,其作用是能将中断线程或其它线程的调用转移到main线程的调用,传统的转移做法是在中断
线程内设置一个标志,然后做主线程进行处理,这样会造成需要创建许多标志变量,而app_scheduler的调度机制可以
避免这种问题出现
- 操作步骤
在工程中加入app_scheduler.c文件
在C/C++选项的Include paths中加入路径
在main.c中加入头文件#include "app_scheduler.h"
step 4:在sdk_config.h中加入宏
#ifndef APP_SCHEDULER_ENABLED#define APP_SCHEDULER_ENABLED 1 #endif
step 5:定义事件调度所需传递的参数类型及变量
typedef struct { uint8_t *pData; uint8_t flag; }custome_event;
custome_event led_event;
step 6:定义2个调度测试的回调函数 void open_led(void *p_event_data, uint16_t event_size) { custome_event *evt = (custome_event*)p_event_data; if(evt->flag) { nrf_gpio_pin_set(15); } else { nrf_gpio_pin_clear(15); } NRF_LOG_INFO("%s",evt->pData); }
void print_world(void *p_event_data, uint16_t event_size) { custome_event *evt = (custome_event*)p_event_data; NRF_LOG_INFO("%s",evt->pData); }
step 7:在main函数中初时化调度器
APP_SCHED_INIT(sizeof(custome_event),2);
- 参数1为事件的空间大小
- 参数2为队列的空间大小
在函数中调用app_sched_execute()函数,当队列中有事件加入,主函数调用app_sched_execute函数将会回调
使用app_sched_event_put函数加入的函数
step 9:1.定义定时器时间间隔宏
#define TICK_32HZ_INTERVAL 1024
2.定义定时器实例变量
APP_TIMER_DEF(m_32hz_id);
3.初时化定时器 static void timers_init(void) { ret_code_t err_code = app_timer_init(); APP_ERROR_CHECK(err_code); // Create timers. err_code = app_timer_create(&m_32hz_id, APP_TIMER_MODE_REPEATED, tick_32hz_timeout_handler); APP_ERROR_CHECK(err_code); }
4.定时定时器启动函数
static void application_timers_start(void) { ret_code_t err_code;
// Start application timers. err_code = app_timer_start(m_32hz_id, TICK_32HZ_INTERVAL, NULL); APP_ERROR_CHECK(err_code);
}
5.定义定时器事件函数,分别在1秒和0.5秒定时到达使用app_sched_event_put函数将事件处理信息加入到队列中
static void tick_32hz_timeout_handler(void * p_context) { UNUSED_PARAMETER(p_context); static uint8_t cnt; if((++cnt & 0x0f) == 0) { led_event.flag ^= 1; led_event.pData = "hello"; app_sched_event_put(&led_event, sizeof(led_event), open_led); } if((cnt & 0x1f) == 0) { led_event.pData = "world"; app_sched_event_put(&led_event, sizeof(led_event), print_world); } } 其中,参数1:led_event为事件调度所要传递的数据参数
参数2:sizeof(led_event)为事件调度所要传递的数据参数的大小
参数3:open_led和print_world为调度器所要回调到的函数
demo下载地址:https://download.csdn.net/download/mygod2008ok/11182266