您当前的位置: 首页 > 

仙剑情缘

暂无认证

  • 0浏览

    0关注

    333博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

nrf52832 scheduler调度机制分析(sdk15.3.0)

仙剑情缘 发布时间:2019-05-16 16:35:24 ,浏览量:0

  • 目的

了解app_scheduler的用法,其作用是能将中断线程或其它线程的调用转移到main线程的调用,传统的转移做法是在中断

线程内设置一个标志,然后做主线程进行处理,这样会造成需要创建许多标志变量,而app_scheduler的调度机制可以

避免这种问题出现

  • 操作步骤
     step 1:

      在工程中加入app_scheduler.c文件

step 2:

   在C/C++选项的Include paths中加入路径

step 3:

在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. 参数1为事件的空间大小
  2. 参数2为队列的空间大小
step 8:

 在函数中调用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

关注
打赏
1658017818
查看更多评论
立即登录/注册

微信扫码登录

0.0362s