了解更多常见问题教程

3个帖子/ 0个新帖子
最后发表
巴拉吉
离线
最后看到:4周18小时前
加入:2019-12-06 06:48
Arch主循环回调

你好,

我已经创建了两个回调user_callback_config.h

static const struct arch_main_loop_callbacks user_app_main_loop_callbacks = {.app_on_init = user_app_init, //默认情况下,系统唤醒时会重新加载看门狗定时器。/ /用户必须考虑到看门狗定时器处理(保持运行,/ /冻结,重载,简历,等),当app_on_ble_powered()被/ /和可能影响主循环。.app_on_ble_powered = user_ble_task / /默认情况下看门狗定时器重载,当系统恢复醒来。/ /用户必须考虑到看门狗定时器处理(保持运行,/ /冻结,重载,简历,等),当app_on_system_powered()被/ /和可能影响主循环。.app_on_system_powered = user_sys_task .app_before_sleep = NULL, .app_validate_sleep = NULL, .app_going_to_sleep =零,.app_resume_from_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 (0 x50003002, 256);返回KEEP_POWERED;// keep_powered, goto_sleep}

这里函数返回KEEP_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 (0 x50003004, 256);返回GOTO_SLEEP;}

在user_ble_task中,该函数返回GOTO_SLEEP并使相同的GPIO低。重新加载200毫秒的WDG使两个函数都以顺序的方式调用。

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

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

附加的逻辑分析器的时间间隔截图。项目使用ble_barebone与NO睡眠模式。与我分享任何示例代码。

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

http://lpccs-docs.dialog-semiconductor.com/Tutorial_SDK6/sdk_architectur..。

Br,

巴拉吉

巴拉吉
离线
最后看到:4周18小时前
加入:2019-12-06 06:48
嗨,对话框中,

嗨,对话框中,

我将user_sys_task设置为并在user_ble_task中创建一个app_easy_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;}

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

static void led_blink_cb() {if (flag == 0) //(GPIO_GetPinStatus(GPIO_LED_PORT, GPIO_LED_PIN)) {SetWord16(0x50003002,512);// PORT_0 PIN_9 LED ON SetWord16(0x50003002,256);// PORT_0 PIN_8连接到逻辑分析仪的时间间隔。标志= 1;} else {SetWord16(0x50003004,512);// PORT_0 PIN_9 LED OFF SetWord16(0x50003004,256);国旗= 0;} }

定时器和延迟的配置,

#define LED_BLNK_TIMER (100) // 100 * 10 = 1 second ble timer timer_hnd led_app_timer __SECTION_ZERO("retention_mem_area0");/ / @RETENTION记忆

当尝试调试在keil我可以观察led切换1秒,但当我连接ble应用通过ble扫描仪延迟减少到一半,即0.5秒打开,0.5秒关闭,在我断开之后,app_easy_timer也不会重置。当我尝试再次连接时,调试器点击app_easy_timer_cancel()中的assert_warning(0)

空白app_easy_timer_cancel (const timer_hnd timer_id){如果APP_EASY_TIMER_HND_IS_VALID (timer_id) {((timer_callbacks [APP_EASY_TIMER_HND_TO_IDX (timer_id)] ! = NULL) & & (timer_callbacks [APP_EASY_TIMER_HND_TO_IDX (timer_id)] ! = timer_canceled_handler)){/ /删除定时器从计时器队列ke_timer_clear (APP_EASY_TIMER_HND_TO_MSG_ID (timer_id),TASK_APP);timer_callbacks [APP_EASY_TIMER_HND_TO_IDX (timer_id)] = timer_canceled_handler;/*发送一个消息给内核,以清除计时器回调函数,并释放计时器回调数组中各自的位置。app_easy_timer_cancel()函数不能保证计时器是否已进入消息队列。因此,必须向内核发送一条消息,通知它所请求的取消操作。*/ struct cancel_timer_struct *req = KE_MSG_ALLOC(APP_CANCEL_TIMER, TASK_APP, TASK_APP, cancel_timer_struct);申请- > timer_id = timer_id;ke_msg_send(要求的);} else {ASSERT_WARNING(0); // this is where the debugger halts. } } else { ASSERT_WARNING(0); } }

通过我的应用程序调试led_app_timer id是零吗在keil看窗户.我想知道什么时候取消我的app_easy_timer()以避免停止。

如果代码有错误,请纠正。

需要知道为什么timer_id是0,有没有竞争条件存在的机会。

谢谢提前

Br,

巴拉。

PM_Dialog
离线
最后看到:9小时26分钟前
工作人员
加入:2018-02-08 11:03
嗨,巴拉

嗨,巴拉

感谢你在网上发布的帖子,以及你的后续评论。我读了你的描述,但作为主人,我不明白你想要完成什么。所以,您能更清楚地描述一下您的要求是什么吗?

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

以上是你的要求吗?

在下面的注释中,我看到您正在使用app_easy_tuimer()。你能检查app_easy_timer_cancel()在你的代码中被调用了吗?

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

谢谢,PM_Dialog