ARCH主循环回调

了解更多常见问题教程

3个职位/0个新职位
最后一篇文章
巴拉吉
离线
最后一次见到:3周3天前
已加入: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_ble_task和user_sys_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(0x50003004,256);返回goto_sleep;}

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

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

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

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

我按照引用引用作为参考。

http://lpccs-docs.dialog-seminiondiond.com/tutorial_sdk6/sdk_architectur ...

布罗尔,

巴拉吉

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

嗨,对话,

我让user_sys_task到空值并在用户任务中创建了一个app\u easy\u timer(),如下所示,

ARCH_MAIN_LOOP_CALLBACK_RET_T USER_BLE_TASK(){LED_APP_TIMER = APP_EASY_TIMER(LED_BLNK_TIMER,LED_BLINK_CB);wdg_reload(watchdog_default_period);返回keep_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_APP_TIMER ID.我查过零了吗在keil看窗口. 我想知道何时取消我的应用程序\u easy\u timer(),以避免此暂停。

如果有任何错误,请更正我的代码。

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

提前致谢

布罗尔,

巴拉吉。

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

嗨巴拉吉,

感谢您在线的帖子和您的后续评论。我读了你的描述,但要成为主持人,我无法理解你想要完成的事情。那么,请你能描述更清楚你的要求是什么?

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

以上声明是您的要求吗?

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

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

谢谢,下午好