如何在RW内核环境中添加和运行新任务

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
15个帖子/ 0新
最后发表
hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
如何在RW内核环境中添加和运行新任务

亲爱的对话yabo国际娱乐半导体,

我正在为多传感器套件DA14585固件添加新的用户空间任务。我是RW实时内核的新手,我不知道如何实现一个简单的任务,什么也不做,但处理一个简单的应用程序SW定时器1秒,并增加一个变量值。我不需要消息或任何复杂的东西在这里。

是否存在一个推荐的例子代码或固件代码,我可以启发自己?

最好的问候,

切赫

关键词:
设备:
hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
我有以下代码。

我有以下代码。函数clocks_handler()永远不会调用。是因为任何消息都没有被发送到task_clocks任务?是通过发送消息驱动的任务切换过程吗?

你能帮助我吗?

#include“rwip_config.h”静态uint32_t unixtime;int clocks_handler(ke_msg_id_t const msgs,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id);/ *默认状态处理程序定义。* / const struct ke_msg_handler clocks_default_state [] = {{ke_msg_default_handler,(ke_msg_func_t)clocks_handler},};/ *指定所有状态常见的消息处理程序。* / const struct 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 struct ke_task_desc task_desc_clocks = {null,&clocks_default_handler,clocks_state,clocks_state_max,1};void swclock_init(void){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); };

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
一旦我试图发送一个假人

一旦我试图发送一个虚拟消息(从app.c模块复制),SIGTRAP异常被捕获。消息发送代码添加在app_entry_point_handler()的开头。根据例外情况,似乎有什么东西没有正确注册。

消息发送代码人工制品如下:

struct 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定义enum在这里(TASK_CLOCKS几乎在末尾添加):

///任务类型定义enum KE_TASK_TYPE{//链路层任务TASK_LLM, TASK_LLC, TASK_LLD, TASK_DBG, #if (DISPLAY_SUPPORT) TASK_DISPLAY, #endif // (DISPLAY_SUPPORT) TASK_APP, //时钟任务//TASK_CLOCKS, TASK_GTL, TASK_L2CC, // L2CAP Controller task TASK_GATTM, // Generic Attribute Profile Manager task TASK_GATTC,// Generic Access 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,};

一旦我在KE_TASK_TYPE枚举中添加了TASK_CLOCKS,就在TASK_APP后面发现了同样的异常SIGTRAP。

这里出了什么问题?

CYibin
离线
最后看到:7个月,4个星期前
工作人员
加入:2017-12-14 02:48
嗨hwidvorakinfo,

hwidvorakinfo

我会在我这边检查,并尽快给你回复。

Br

宜宾

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
亲爱的宜宾,就是有的话

亲爱的宜宾,有可能如何帮助我吗?

切赫

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
你好,宜宾,

你好,宜宾,

我只想添加函数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(); /* ************************************************************************************

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
我又往前走了一步

我进一步走了一点,但我仍在围绕着丛林。

我回到文档。在文档UM-B-079_DA14585_586_SDK_6_Software_Platform_Reference_5v0中,我发现:

内核的核心是在应用程序的主循环中运行的调度程序。调度程序检查是否设置了事件并通过调用相应的处理程序来服务待处理的事件。该事件可以是BLE或TIMER事件,两个任务之间的消息。

任务调度程序是由事件驱动的。我们开始计时。我想使用easy_app_timer API函数,但是这个实现只使用TASK_APP环境。我不想重写了。再退一步。我将启动计时器,而不是一个任务。

静态volatile uint32_t unixtime;静态timer_hnd clocks_timer_handler;void swclock_init(void){unixtime = 0;clocks_timer_handler = app_easy_timer(clocks_period,clocks_handler);void clocks_handler(void){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 ();

我尝试了很多地方,但只有一个地方行得通:

void start_advertise_blink(void){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;if(iot_env.led_tmr_hndl!= eyle_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 ();}

在哪里放置我的用户空间函数初始化器?我不想和这个项目有任何争执。我想让它尽可能好,但我不想黑进代码,在代码中制造肮脏的东西。

请问,你能帮我解决上面的问题和这个问题吗?

致以最亲切的问候

切赫

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
好的,可能没有帮助

好吧,可能不会有什么帮助。我通过设置一个计时器来帮助自己,计时器处理程序为从BLE任务分派器下面的主循环调用的另一个函数启用了一个标志。它不优雅,也不伟大,但它在工作。

亲爱的对话yabo国际娱乐框半导体,请你帮我解决我仍有的任务问题吗?

PM_Dialog
离线
最后看到:1天20小时前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

我道歉,但可能我错过了你的问题,不确定发生了什么。我会查看您提供的所有信息,我会尽力为您提供尽快帮助您。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:1天20小时前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

我看了你之前的评论,我有点困惑。你能解释一下你想完成什么吗?一般情况下,不建议修改SDK文件。应该使用SDK中提供的所有SDK。您应该使用我们的app_easy_xxx api。您对app_easy_timer的要求是什么?

谢谢,PM_Dialog

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
你好pm_dialog,

你好pm_dialog,

问题很简单。如何创建与现有应用程序任务一起运行的新任务。整个计时器只是一个权宜之计。

切赫

PM_Dialog
离线
最后看到:1天20小时前
工作人员
加入:2018-02-08 11:03
嗨hwidvorakinfo,

嗨hwidvorakinfo,

请记住,DA145xx产品系列不支持多任务处理功能。DA1468x/ DA1469x基于实时抢占式操作系统FreeRTOS,该系统具有多任务处理能力。Kernel是一个非常简单的调度程序,它不提供与FreeRTOS相同的功能。SDK提供了一些api来开始开发您自己的应用程序。您不应该自己创建任务和处理程序。如果您想自己做实验,请阅读UM-B-051文件5.3节。任务是通过调用ke_task_create()函数创建的。

谢谢,PM_Dialog

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
你好pm_dialog,

你好pm_dialog,

谢谢你。

切赫

MHv_Dialog
离线
最后看到:三个月三个星期前
工作人员
加入:15 2013-12-06
你好,

你好,

添加到PM_Dialog的注释…

在一个新的RW任务中实现您的功能,只有当该任务需要作为多个动态创建的实例运行时才会有好处(即使这样,您也很可能更好执行一个新任务)。如果您的“任务”作为单个实例运行,您应该将其作为主用户任务的一部分运行,从而节省实现一个新的RW任务带来的开销和复杂性。任务切换不是“免费”的。

MHv

hwidvorakinfo
离线
最后看到:3个月5天前
加入:2019-10-17 06:49
你好mhv_dialog,

你好mhv_dialog,

谢谢你的解释。我将RW内核作为调度程序运行任务。

P。