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

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

亲爱的Di雷竞技电竞平台alog Semiconductor:,

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

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

此致,

切赫

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

我有以下代码。从未调用函数“\u handler()”。是否因为没有向任务发送任何消息?任务切换过程是否由发送消息驱动?

你能帮助我吗?

#包括“rwip_config.h”静态uint32_t unixtime;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);/*默认状态处理程序定义。*/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);/*定义所有任务实例状态的占位符。*/国家时钟状态[1](保留区)(0);//保留内存//时钟任务描述符静态常量结构ke_Task_desc Task_desc_Clocks={NULL,&Clocks_default_handler,Clocks_state,Clocks_state_MAX,1};void swclock_init(void){unixtime=0;//调用内核函数启动一个新任务ke_task_create(task_CLOCKS,&task_DESC_CLOCKS);//初始化任务状态ke_state_set(任务时钟,时钟运行);}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_ti;i++;返回(已消费的食物);};

hwidvorakinfo
离线
最后看到:5个月3周前
加入:2019-10-17 06:49
有一次我想送一个假人

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

消息发送代码如下所示:

结构gapm\u update\u adversed\u data\u cmd*cmd=KE\u MSG\u ALLOC(gapm\u update\u adversed\u data\u cmd、TASK\u时钟、TASK\u APP、gapm\u update\u adversed\u data\u cmd);cmd->operation=GAPM\u UPDATE\u advision\u DATA;cmd->adv_data_len=0;发送消息(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被捕获。

这里出了什么问题?

CYibin
离线
最后看到:10个月3周前
工作人员
加入:2017-12-14 02:48
嗨hwidvorakinfo,

hwidvorakinfo

我会在我这边查看,并尽快给你答复。

Br

宜宾

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

亲爱的宜宾,有没有可能帮助我?

切赫

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

你好,宜宾,

我只想添加正在从模块arch_system.c中的system_init()函数调用的函数swclock_init()。将swclock_init()调用放在下面代码的底部:

/*******男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生_PRESENT)APP_init();//初始化APP#endif(user_APP_main_loop_callbacks.APP_on_init=NULL)用户\应用\主\循环\回调//初始化lld_sleep lld_sleep_init_func()#如果(使用自适应设置和使用功率优化)twirq\u set\u min=TWIRQSET\u min\u XTAL32;twirq_set_max=TWIRQSET_max_XTAL32_刻度;twirq_set=TWIRQSET_INIT_XTAL32_TICKS#若果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果果AL16_uuutrim_init()#if(CFG_RF_DIAG_INT)//根据RF操作模式(PLL-LUT/MGC_KMODALPHA和VCO粗略校准组合)启用TX_EN/RX_EN中断(RF_DIAG_irq_mode_RXTX)#*********************************************************************************************************************************************************方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方swclock_init();/*************************************************************************************

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

我又向前迈了一小步,但仍在绕圈子。

我回到了文件。在文档UM-B-079_DA14585_586_SDK_6_SOFTWARE_PLATFORM_REFICE_5V0我找到了以下内容:

内核的核心是在应用程序的主循环中运行的调度程序。调度程序检查是否设置了事件并通过调用相应的处理程序为挂起事件提供服务。事件可以是BLE或定时器事件,即两个任务之间的消息。

好的,所以任务调度程序是由事件驱动的。所以让我们开始计时器。我想使用Easy_App_Timer API函数,但此实现仅使用Task_App环境。我不想重写它。所以另一步回来了。而不是任务,我将发起计时器。

Static 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模块中,但未调用时钟处理程序():

#if(ble_app_present)app_init();//初始化应用程序/ * ************************************************************************************** * CAGBLE Internal or RTC clock init ************************************************************************************ */ #if (CAGEM_RTC_CLOCK) rtc_init(); #elif (CAGEM_SW_CLOCK) swclock_init(); #endif #endif

我试过了无效的用户\u物联网\u应用程序\u在\u初始化无效的),但没有调用clocks_handler():

如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN)) {periph_init ();} arch_printf(“\ r \ n \ r \ n \ r \ n = = = = = = = =物联网+开始 ========");swclock_init ();

我试了很多地方,但只有一个地方管用:

无效开始闪烁(无效){iot_env.led_tmr_state=0//发光二极管关闭物联网环境发光二极管tmr闪烁=0xFFFF;iot_env.led_on_time=广告_led_on_time;iot_env.led_off_time=广告_led_off_time;如果(iot_环境led_tmr_hndl!=轻松计时器\u无效计时器){app\u轻松计时器\u取消(iot\u env.led\u tmr\u hndl)}iot_env.led_tmr_hndl=应用程序_easy_timer(广告_led_OFF_TIME,用户_led_timer_handler);swclock_init();}

在哪里放置我的用户空间函数初始化?我不想和这个项目打一仗。我想让它尽可能地好,但我不想黑代码,在代码中制造肮脏的东西。

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

致以最亲切的问候

切赫

hwidvorakinfo
离线
最后看到:5个月3周前
加入:2019-10-17 06:49
好吧,可能没有人会帮忙

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

亲爱的Di雷竞技电竞平台alog半导体,你能帮我解决我还有的任务问题吗?

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

嗨hwidvorakinfo,

我很抱歉,但我可能没有回答你的问题,不知道发生了什么。我将检查您提供的所有信息,今天我将很快为您提供帮助。

谢谢,PM_Dialog

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

嗨hwidvorakinfo,

我正在阅读你以前的评论,我很困惑。你能试着解释你想要完成的事情吗?通常,建议不要修改SDK文件。所有SDK应在SDK内提供。您应该使用我们的app_easy_xxx API。哪个是您对App_easy_Timer的要求?

谢谢,PM_Dialog

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

你好,PM_Dialog,

问题很简单。如何创建与现有应用程序任务一起运行的新任务。整个定时器只是一个解决方法。

切赫

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

嗨hwidvorakinfo,

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

谢谢,PM_Dialog

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

你好,PM_Dialog,

非常感谢。

切赫

MHv_Dialog
离线
最后看到:1个月2周前
工作人员
加入:2013-12-06 15:10
你好,

你好,

要添加到PM_Dialog的注释…

在新的RW任务中实现您的功能将只有效益,如果所述任务需要作为多个动态创建的实例运行(甚至那么,您非常可能会更好地运行执行新任务)。如果您的“任务”作为单个实例运行,那么您应该将其作为主要用户任务的一部分运行,从而节省实现新的RW任务所带来的开销和复杂性。任务切换不是免费的。

MHv

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

你好,MHv_对话,

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

P.