我正在从事DA14580_DIALOG_BEACONS_3.40.2项目,需要时我需要做一些加密工作。aes128模块工作正常,但是昨天我发现了一个奇怪的问题。我做一些如下的操作。
我用的是延长睡眠模式。
首先我在app_adv_func()中发送gapm_use_enc_block_cmd:
Void app_adv_func(struct gapm_start_advertise_cmd *cmd)
{
/ /广告数据
//扫描响应数据
app_env。Enc_in_use = true;//加密模块繁忙
/ /发送加密命令
struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd,
TASK_GAPM TASK_APP,
gapm_use_enc_block_cmd);
cmd - >操作= GAPM_USE_ENC_BLOCK;
memcpy (cmd - > operand_1 app_env。关键,16);
memcpy (cmd - > operand_2 app_env。明文,16);
//发送消息
ke_msg_send (cmd);
}
其次,我进行一些打印并设置一个标志来表明加密已经完成。
int gapm_use_enc_block_ind_handler (ke_msg_id_t是否,
struct gapm_use_enc_block_ind *参数,
ke_task_id_t dest_id,
ke_task_id_t src_id)
{
cpl arch_printf(“数据加密\ r \ n”);
app_env。Enc_in_use = false;//该标志用于指示加密模块现在是空闲的
App_adv_stop();//加密完成,停止更新数据
返回(KE_MSG_CONSUMED);
}
最后检查app_env。Enc_in_use标志,等待加密模块空闲,然后发送另一个加密CMD
空白app_set_dev_config_complete_func(空白)
{
ke_state_set (TASK_APP APP_CONNECTABLE);
app_adv_start ();
While (app_env.enc_in_use);//检查标记并等待加密模块空闲
app_env。Enc_in_use = true;//加密模块繁忙
/ /发送加密命令
struct gapm_use_enc_block_cmd *cmd = KE_MSG_ALLOC(gapm_use_enc_block_cmd,
TASK_GAPM TASK_APP,
gapm_use_enc_block_cmd);
cmd - >操作= GAPM_USE_ENC_BLOCK;
memcpy (cmd - > operand_1 app_env。关键,16);
memcpy (cmd - > operand_2 app_env。明文,16);
//发送消息
ke_msg_send (cmd);
}
结果是加密模块不能工作,代码正在执行while(app_env.enc_in_use);所有的时间。与此同时,当然,不要打印任何东西。
但是在我注释了一行while(app_env.enc_in_use);在void app_set_dev_config_complete_func(void)中,加密模块工作正常,并成功打印"data encryption cpl"。
如您所见,在某个初始化过程之后,我需要执行两个加密操作。
有什么建议吗?
你好,
While (app_env.enc_in_use);//检查标记并等待加密模块空闲
请记住,整个系统是不可抢占的。一旦while循环开始,整个系统就会被这个while循环阻塞。
因此app_env。Enc_in_use将不会得到更新。所以代码可能会死锁。我认为这就是正在发生的事情。
@WT_Dialog,谢谢你,但我还有一个问题。系统中的中断(由定时器、外部引脚信号等引起)是否也没有抢占性?
嗨,打扰是抢先的。但是任务(TASK_APP, TASK_GAPC等)不是抢占的。
你解决了我的问题,谢谢。
关于DA14580的中断系统,你能给我更详细的解释一下吗?最近我遇到了一个很奇怪的问题,就是偶尔没有检测到外部中断。谢谢。
例如,使用GLOBAL_INT_DISABLE()和GLOBAL_INT_RESTORE()对是否有任何副作用?
嗨summer20100514,
对于中断系统没有特别的文档,你可以参考ARM的手册。
由于MT_dialog