ARCH主循环回调

了解更多常见问题教程

3个职位/0个新职位
最后一篇文章
巴拉吉
离线
最后一次见到:3周2天前
已加入:2019-12-06 06:48
ARCH主循环回调

你好,

我在中创建了两个回调用户\回调\配置.h

static const struct arch\u main\u loop\u callbacks user\u app\u main\u loop\u callbacks={.app\u on\u init=user\u app\u init,//默认情况下,系统唤醒时重新加载并恢复看门狗计时器。//用户必须考虑看门狗计时器的处理(保持它运行,//冻结它,重新加载它,恢复它,等等),当调用table\u powered()上的app\u时,可能会影响主循环。app \u on \u ble \u powered=user \u ble \u task,//默认情况下,系统唤醒时重新加载并恢复看门狗计时器。//当调用\ system\ powered()上的app\时,用户必须考虑看门狗计时器的处理(保持它运行,//冻结它,重新加载它,恢复它,等等),并且可能会影响主循环。app\u on\u system\u powered=user\u sys\u task、.app\u before\u sleep=NULL、.app\u validate\u sleep=NULL、.app\u going\u to\u sleep=NULL、.app\u resume\u from\u sleep=NULL、};

我定义了user\u ble\u task和user\u sys\u task,如下所示

arch_main_loop_callback_ret_t user_sys_task(){//sprintf((char*)flg_buff,“%d\n”,c);//uart_send(UART2,(uint8_t*)flg_buff,strlen(flg_buff),uart_OP_BLOCKING);SetWord16(0x50003002256);return KEEP_POWERED;//KEEP_POWERED,GOTO_SLEEP}

在这里,函数返回KEEP\ u POWERED并使GPIO高。

arch_main_loop_callback_ret_t user_ble_task(){//sprintf((char*)flg_buff,“%d\n”,b);//uart_send(UART2,(uint8_t*)flg_buff,strlen(flg_buff),uart_OP_BLOCKING);wdg_reload(WATCHDOG_DEFAULT_PERIOD);SetWord16(0x50003004256);return GOTO_SLEEP;}

在user\u ble\u task中,函数返回GOTO\u SLEEP并使相同的GPIO变低。200ms的wdg重载使这两个函数都按顺序调用。

是时候了18微秒和低时间1微秒。(如何实现所有周期的相同延迟)

我知道这些环回是异步执行,如何执行这些环回中的任何硬件计时器/appEasytimer()回调。

随附的时间间隔逻辑分析仪屏幕截图。项目使用了无睡眠模式的ble-u-barebone。分享给我任何样本代码。

我引用以下链接作为参考。

http://lpccs docs.dialog semiconductor.com/Tutorial\u SDK6/sdk\u architectur。。。

比尔,

巴拉吉

附件:
巴拉吉
离线
最后一次见到:3周2天前
已加入:2019-12-06 06:48
嗨,对话,

嗨,对话,

我已将用户系统任务设置为无效的并在用户任务中创建了一个app\u easy\u timer(),如下所示,

arch\u main\u loop\u callback\u ret\t user\u ble\u task(){led\u app\u timer=app\u easy\u timer(led\u BLNK\u timer,led\u blink\u cb);wdg\u reload(WATCHDOG\u DEFAULT \u PERIOD);return KEEP\u POWERED;}

在回调中,我使用了一个标志并切换了1秒

static void led_blink_cb(){if(flag==0)//(GPIO_GetPinStatus(GPIO_led_PORT,GPIO_led_PIN)){设置字16(0x50003002512);//设置字16上的端口_0 PIN_9 led(0x50003002256);//连接到逻辑分析仪的端口_0 PIN_8,用于时间间隔。flag=1;}else{SetWord16(0x50003004512);//端口0引脚9 LED关闭SetWord16(0x50003004256);flag=0;}}

定时器和延迟配置,

#define LED_BLNK_TIMER(100)//100*10=1秒ble TIMER TIMER_hnd LED_app_TIMER u SECTION_ZERO(“retention_mem_area0”);//@保留内存

当试图在keil中调试时,我可以观察到led的切换1秒钟,但当我通过ble连接到应用程序时ble扫描仪延迟减少到一半,即0.5秒打开,0.5秒关闭,在我断开连接后,应用程序\u easy\u计时器也不会重置。当我再次尝试连接时,调试器在app\u easy\u timer\u cancel()中点击assert\u warning(0)

void app\u easy\u timer\u cancel(const timer\u hnd timer\u id){如果app\u easy\u timer\u hnd\u有效(timer\u id){如果((timer\u回调[app\u easy\u timer\u hnd\u到\u IDX(timer\u id)]!=NULL)&(timer\u回调[APP\u EASY\u timer\u HND\u TO\u IDX(timer\u id)]!=timer\u cancelled\u handler){//从计时器队列中删除计时器ke\u timer\u clear(APP\u EASY\u timer\u HND\u TO \u MSG\u ID(timer\u ID),TASK\u APP);timer\u回调[APP\u EASY\u timer\u HND\u TO \u IDX(timer\u ID)]=timer\u cancelled\u handler;/*向内核发送消息以清除计时器回调函数并释放计时器回调中的相应位置数组。app\u easy\u timer\u cancel()函数无法保证计时器是否已进入消息队列。因此,必须向内核发送一条消息,并通知它所请求的取消操作。*/struct cancel_timer_struct*req=KE_MSG_ALLOC(APP_cancel_timer,TASK_APP,TASK_APP,cancel_timer_struct);req->timer_id=timer_id;KE_MSG_send(req);}else{ASSERT_WARNING(0);//这是调试器停止的地方。}}否则{断言警告(0);}}

通过我的应用程序调试led应用程序计时器id我查过零了吗在凯尔看窗户. 我想知道何时取消我的应用程序\u easy\u timer(),以避免此暂停。

如果有什么问题,请更正我的代码。

需要知道为什么计时器的id是零,是否有任何可能的比赛条件存在。

提前谢谢

比尔,

巴拉吉。

PM\U对话框
离线
最后一次见到:1天19小时前
工作人员
已加入:2018-02-08 11:03
你好,巴拉吉,

你好,巴拉吉,

谢谢你在网上的帖子和你的后续评论。我读了你的描述,但作为主人,我无法理解你想要完成什么。那么,你能更清楚地描述一下你的要求吗?

>>>如何在这些环回中执行任何硬件计时器/table appEasytimer()回调。

以上声明是您的要求吗?

在下面的评论中,我看到您正在使用app\u easy\u tuimer()。你能检查一下你的代码中是否调用了app\u easy\u timer\u cancel()?

请提供适当的步骤,以便我可以复制这个问题。

谢谢,下午好