亲爱的Di雷竞技电竞平台alog半导体,
我正在为多传感器套件DA14585固件添加新的用户空间任务。我是RW实时内核的新手,我不知道如何实现一个简单的任务,什么都不做,但处理一个简单的应用程序SW定时器1秒,并增加一个变量值。在这里我不需要消息或任何复杂的东西。
是否存在一个推荐的示例代码或固件代码,我可以启发自己?
最好的问候,
切赫
我有以下代码。功能clocks_handler()不会被调用。是不是因为味精不被发送到TASK_CLOCKS任务?是通过发送消息驱动的任务切换处理?
你能帮助我吗?
#包括 “rwip_config.h” 静态uint32_t的unixtime;INT clocks_handler(ke_msg_id_t常量MSGID,空隙常量* PARAM,ke_task_id_t const的DEST_ID,ke_task_id_t常量src_id);/ *默认状态处理程序定义。* /常量结构ke_msg_handler clocks_default_state [] = {{KE_MSG_DEFAULT_HANDLER,(ke_msg_func_t)clocks_handler},};/ *指定消息处理程序,它适用于所有国家。* /常量结构ke_state_handler clocks_default_handler = KE_STATE_HANDLER(clocks_default_state);/ *定义所有的任务实例的状态的占位符。* / ke_state_t clocks_state [1] __SECTION_ZERO( “retention_mem_area0”);//保持存储器//时钟任务描述符为static const结构ke_task_desc TASK_DESC_CLOCKS = {NULL,&clocks_default_handler,clocks_state,CLOCKS_STATE_MAX,1};空隙swclock_init(无效){unixtime = 0; // call the kernel function to start a new task ke_task_create(TASK_CLOCKS, &TASK_DESC_CLOCKS); // Initialize Task state ke_state_set(TASK_CLOCKS, CLOCKS_RUNNING); } int clocks_handler(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { static volatile uint8_t i; i++; return (KE_MSG_CONSUMED); };
一旦我试图发送一个假消息(从app.c模块复制),SIGTRAP异常就会被捕获。消息发送代码被添加在app_entry_point_handler()的开头。根据例外情况,似乎有些东西没有正确注册。
消息发送代码假象如下:
结构gapm_update_advertise_data_cmd * CMD = KE_MSG_ALLOC(GAPM_UPDATE_ADVERTISE_DATA_CMD,TASK_CLOCKS,TASK_APP,gapm_update_advertise_data_cmd);CMD->操作= GAPM_UPDATE_ADVERTISE_DATA;CMD-> adv_data_len = 0;ke_msg_send(cmd);
任务定义枚举如下(TASK_CLOCKS几乎在末尾添加):
///任务类型定义enum KE_TASK_TYPE{//链路层任务TASK_LLM, TASK_LLC, TASK_LLD, TASK_DBG, #if (DISPLAY_SUPPORT) TASK_DISPLAY, #endif // (DISPLAY_SUPPORT) TASK_APP, // CLOCKS任务//TASK_CLOCKS, TASK_GTL, TASK_L2CC, // L2CAP Controller任务TASK_GATTM, // Generic Attribute Profile Manager任务TASK_GATTC,// Generic Attribute Profile Controller Task TASK_GAPM, // Generic Access Profile Manager TASK_GAPC, // Generic Access Profile Controller TASK_RFU_1, TASK_RFU_2, TASK_RFU_3, TASK_RFU_4, TASK_RFU_5, #if (USE_AES) #define TASK_AES TASK_RFU_1 #endif //分配一定数量的Profile任务TASK_PRF_MAX = (TASK_RFU_5 + BLE_NB_PROFILES),// CAGBLE时钟任务TASK_CLOCKS, ///最大任务数TASK_MAX, TASK_NONE = 0xFF,};
当我在TASK_APP后面的KE_TASK_TYPE enum中添加TASK_CLOCKS时,同样的异常SIGTRAP被捕获。
这里出了什么问题?
嗨hwidvorakinfo,
我会在我这边查看,并尽快给你答复。
Br
宜宾
亲爱的宜宾,是否有可能,怎么帮我?
你好,宜宾,
我只想添加函数swclock_init()正在从模块arch_system.c的system_init()函数被调用。下面的代码将swclock_init()调用放置在底部:
/ * **********************************************Application initializations ************************************************************************************ */ // Initialise APP #if (BLE_APP_PRESENT) app_init(); // Initialize APP #endif if (user_app_main_loop_callbacks.app_on_init !=NULL) user_app_main_loop_callbacks.app_on_init(); //Initialise lld_sleep lld_sleep_init_func(); #if (USE_XTAL16M_ADAPTIVE_SETTLING && USE_POWER_OPTIMIZATIONS) twirq_set_min = TWIRQSET_MIN_XTAL32_TICKS; twirq_set_max = TWIRQSET_MAX_XTAL32_TICKS; twirq_set = TWIRQSET_INIT_XTAL32_TICKS; #endif /* ************************************************************************************ * XTAL16M trimming settings ************************************************************************************ */ //set trim and bias of xtal16 xtal16__trim_init(); #if (CFG_RF_DIAG_INT) // Enable the TX_EN/RX_EN interrupts, depending on the RF mode of operation (PLL-LUT/MGC_KMODALPHA and VCO coarse calibration combinations) enable_rf_diag_irq(RF_DIAG_IRQ_MODE_RXTX); #endif // CFG_RF_DIAG_INT /* ************************************************************************************ * Internal clock init ************************************************************************************ */ swclock_init(); /* ************************************************************************************
我还做了一个小小的一步,但我还是旁敲侧击。
我回到文档中。在文档UM-B-079_DA14585_586_SDK_6_Software_Platform_Reference_5v0中我发现了这个:
内核的核心是在应用程序的主循环中运行的调度程序。调度程序检查是否设置了事件服务通过调用相应的处理程序中的未决事件。该事件可以是一个或BLE定时器事件,两个任务之间的消息。
任务调度程序是由事件驱动的。让我们开始一个计时器。我想使用easy_app_timer API函数,但是这个实现只使用TASK_APP环境。我不想重写它。所以再退一步。而不是一个任务,我将启动计时器。
静态挥发性uint32_t的unixtime;静态timer_hnd clocks_timer_handler;空隙swclock_init(无效){unixtime = 0;clocks_timer_handler = app_easy_timer(CLOCKS_PERIOD,clocks_handler);}空隙clocks_handler(无效){unixtime ++;clocks_timer_handler = app_easy_timer(CLOCKS_PERIOD,clocks_handler);返回;};
但是这里的问题是将swclock_init()函数调用放在哪里。
我试图在空白system_init(空白)arch_system.c模块,但clocks_handler()中不叫:
#如果(BLE_APP_PRESENT) app_init ();/ /初始化应用程序 /* ************************************************************************************ * CAGBLE内部或RTC时钟初始化 ************************************************************************************ */ # 如果CAGEM_RTC_CLOCK rtc_init ();# elif (CAGEM_SW_CLOCK) swclock_init ();# endif # endif
我试图在空白user_iot_app_on_init(空白),但没有调用clocks_handler():
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN)) {periph_init ();} arch_printf(“\ r \ n \ r \ n \ r \ n = = = = = = = =物联网+开始 ========");swclock_init ();
我试了很多地方,但只有一个地方管用:
空隙start_advertise_blink(无效){iot_env.led_tmr_state = 0;// LED OFF iot_env.led_tmr_blinks = 0xFFFF的;iot_env.led_on_time = ADVERTISE_LED_ON_TIME;iot_env.led_off_time = ADVERTISE_LED_OFF_TIME;如果(iot_env.led_tmr_hndl = EASY_TIMER_INVALID_TIMER!){app_easy_timer_cancel(iot_env.led_tmr_hndl);} iot_env.led_tmr_hndl = app_easy_timer(ADVERTISE_LED_OFF_TIME,user_led_timer_handler);swclock_init ();}
在哪里放置我的用户空间函数初始化?我不想和这个项目打一仗。我想让它尽可能地好,但我不想黑代码,在代码中制造肮脏的东西。
请问,你能帮我解决以上问题和这个问题吗?
致以最亲切的问候
好吧,可能不会有什么帮助。我通过设置一个计时器来帮助自己,计时器处理程序为从BLE任务分派器下面的主循环调用的另一个函数启用了一个标志。它不优雅,不伟大,但它是有效的。
亲爱的Di雷竞技电竞平台alog半导体,请你能帮助我的任务问题,我仍然有?
嗨hwidvorakinfo,
我道歉,但可能我错过了你的问题,不知道发生了什么。我将检查所有提供的信息,我会尽量今天很快帮你。
谢谢,PM_Dialog
我在读你之前的评论,我有点困惑。你能解释一下你想要完成什么吗?一般情况下,不建议修改SDK文件。所有SDK都应该按照SDK中提供的方式使用。你应该使用我们的app_easy_xxx api。您对app_easy_timer的要求是什么?
你好PM_Dialog,
问题很简单。如何创建与现有应用程序任务一起运行的新任务。整个计时器只是一个变通方法。
请记住DA145xx产品家族不支持多任务功能。DA1468x/ DA1469x基于具有多任务处理能力的实时抢占式操作系统FreeRTOS。内核是一个非常简单的调度程序,它不提供与FreeRTOS相同的功能。SDK提供了几个api来开始开发您自己的应用程序。您不应该自己创建任务和处理程序。如果你想自己做实验,请阅读UM-B-051文件的5.3节。这个任务是通过调用ke_task_create()函数创建的。
谢谢你。
你好,
要添加到PM_Dialog的注释…
只有当任务需要作为多个动态创建的实例运行时,在新的RW任务中实现您的功能才会有好处(即使这样,您也很可能更好不执行新任务)。如果您的“任务”作为单个实例运行,那么您应该将其作为主要用户任务的一部分运行,从而节省实现新的RW任务所带来的开销和复杂性。任务切换不是免费的。
MHv
你好MHv_Dialog,
谢谢你的解释。我把RW内核运行的任务调度。
P。
我有以下代码。功能clocks_handler()不会被调用。是不是因为味精不被发送到TASK_CLOCKS任务?是通过发送消息驱动的任务切换处理?
你能帮助我吗?
一旦我试图发送一个假消息(从app.c模块复制),SIGTRAP异常就会被捕获。消息发送代码被添加在app_entry_point_handler()的开头。根据例外情况,似乎有些东西没有正确注册。
消息发送代码假象如下:
任务定义枚举如下(TASK_CLOCKS几乎在末尾添加):
当我在TASK_APP后面的KE_TASK_TYPE enum中添加TASK_CLOCKS时,同样的异常SIGTRAP被捕获。
这里出了什么问题?
嗨hwidvorakinfo,
我会在我这边查看,并尽快给你答复。
Br
宜宾
亲爱的宜宾,是否有可能,怎么帮我?
切赫
你好,宜宾,
我只想添加函数swclock_init()正在从模块arch_system.c的system_init()函数被调用。下面的代码将swclock_init()调用放置在底部:
我还做了一个小小的一步,但我还是旁敲侧击。
我回到文档中。在文档UM-B-079_DA14585_586_SDK_6_Software_Platform_Reference_5v0中我发现了这个:
内核的核心是在应用程序的主循环中运行的调度程序。调度程序检查是否设置了事件服务通过调用相应的处理程序中的未决事件。该事件可以是一个或BLE定时器事件,两个任务之间的消息。
任务调度程序是由事件驱动的。让我们开始一个计时器。我想使用easy_app_timer API函数,但是这个实现只使用TASK_APP环境。我不想重写它。所以再退一步。而不是一个任务,我将启动计时器。
但是这里的问题是将swclock_init()函数调用放在哪里。
我试图在空白system_init(空白)arch_system.c模块,但clocks_handler()中不叫:
我试图在空白user_iot_app_on_init(空白),但没有调用clocks_handler():
我试了很多地方,但只有一个地方管用:
在哪里放置我的用户空间函数初始化?我不想和这个项目打一仗。我想让它尽可能地好,但我不想黑代码,在代码中制造肮脏的东西。
请问,你能帮我解决以上问题和这个问题吗?
致以最亲切的问候
切赫
好吧,可能不会有什么帮助。我通过设置一个计时器来帮助自己,计时器处理程序为从BLE任务分派器下面的主循环调用的另一个函数启用了一个标志。它不优雅,不伟大,但它是有效的。
亲爱的Di雷竞技电竞平台alog半导体,请你能帮助我的任务问题,我仍然有?
嗨hwidvorakinfo,
我道歉,但可能我错过了你的问题,不知道发生了什么。我将检查所有提供的信息,我会尽量今天很快帮你。
谢谢,PM_Dialog
嗨hwidvorakinfo,
我在读你之前的评论,我有点困惑。你能解释一下你想要完成什么吗?一般情况下,不建议修改SDK文件。所有SDK都应该按照SDK中提供的方式使用。你应该使用我们的app_easy_xxx api。您对app_easy_timer的要求是什么?
谢谢,PM_Dialog
你好PM_Dialog,
问题很简单。如何创建与现有应用程序任务一起运行的新任务。整个计时器只是一个变通方法。
切赫
嗨hwidvorakinfo,
请记住DA145xx产品家族不支持多任务功能。DA1468x/ DA1469x基于具有多任务处理能力的实时抢占式操作系统FreeRTOS。内核是一个非常简单的调度程序,它不提供与FreeRTOS相同的功能。SDK提供了几个api来开始开发您自己的应用程序。您不应该自己创建任务和处理程序。如果你想自己做实验,请阅读UM-B-051文件的5.3节。这个任务是通过调用ke_task_create()函数创建的。
谢谢,PM_Dialog
你好PM_Dialog,
谢谢你。
切赫
你好,
要添加到PM_Dialog的注释…
只有当任务需要作为多个动态创建的实例运行时,在新的RW任务中实现您的功能才会有好处(即使这样,您也很可能更好不执行新任务)。如果您的“任务”作为单个实例运行,那么您应该将其作为主要用户任务的一部分运行,从而节省实现新的RW任务所带来的开销和复杂性。任务切换不是免费的。
MHv
你好MHv_Dialog,
谢谢你的解释。我把RW内核运行的任务调度。
P。