我工作的项目DA14580_DIALOG_BEACONS_3.40.2,并在必要时,我需要做一些加密工作。该AES128模块运作良好,但我昨天发现了一个奇怪的问题。我做了一些操作如下。
我使用的是扩展的睡眠模式。
首先,我在app_adv_func发送gapm_use_enc_block_cmd():
空隙app_adv_func(结构gapm_start_advertise_cmd * CMD)
{
//广告数据
//扫描响应数据
app_env.enc_in_use = TRUE; //加密moudule忙
//发送加密命令
结构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.key,16);
的memcpy(CMD-> operand_2,app_env.plaintext,16);
//发送消息
ke_msg_send(CMD);
}
其次,我做了一些印刷并设置一个标志来表示加密完成。
INT gapm_use_enc_block_ind_handler(ke_msg_id_t MSGID,
结构gapm_use_enc_block_ind * PARAM,
ke_task_id_t DEST_ID,
ke_task_id_t src_id)
{
arch_printf( “数据加密CPL \ r \ n”);
app_env.enc_in_use = FALSE; //使用标志以指示加密moudule现在处于空闲状态
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();
而(app_env.enc_in_use);用于加密moudule空闲//检查标志,并等待
app_env.enc_in_use = TRUE; //加密moudule忙
//发送加密命令
结构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.key,16);
的memcpy(CMD-> operand_2,app_env.plaintext,16);
//发送消息
ke_msg_send(CMD);
}
其结果是加密模块将不起作用,并且所述代码在执行时(app_env.enc_in_use);每时每刻。与此同时,当然,打印什么。
但经过我的评论的线,而(app_env.enc_in_use);在虚空app_set_dev_config_complete_func(无效),在encrytion模块运作良好,并打印“数据加密CPL”成功。
正如你所看到的,我需要一些初始化程序后做两个加密操作。
有什么建议?
你好,
而(app_env.enc_in_use);用于加密moudule空闲//检查标志,并等待
请记住,整个系统是非抢占。一旦while循环开始,整个系统由这个while循环受阻。
所以app_env.enc_in_use不会得到更新。因此,代码可以在僵局中结束。我认为这是发生了什么。
@WT_Dialog,谢谢你,但我仍然有一个问题。这是真的,中断(由定时器,外部管脚信号等)中的系统都是非抢占要么?
您好,中断被抢占。但任务(TASK_APP,TASK_GAPC等)不抢占。
你解决我的问题,谢谢。
您能给我说说DA14580的中断系统的详细说明?最近我遇到了外部中断一段时间没有检测到一次一个奇怪的问题。谢谢。
例如,是否有任何副作用使用GLOBAL_INT_DISABLE()和GLOBAL_INT_RESTORE()对?
嗨summer20100514,
有用于中断系统没有特定的文档,你可以指点ARM手册此。
谢谢mt_dialog.