我正在从事项目DA14580_DIALOG_BEACONS_3.40.2,必要时我需要做一些加密工作。aes128模块工作正常,但我昨天发现了一个奇怪的问题。我做了如下一些操作。
我正在使用延长睡眠模式。
首先,我在app_adv_func()中发送gapm_use_enc_block_cmd:
void app_adv_func(结构gapm_start_advision_cmd*cmd)
{
//广告数据
//扫描响应数据
app_env.enc_in_use=true//加密模块忙
//发送加密命令
结构gapm_use_enc_block_cmd*cmd=KE_MSG_ALLOC(gapm_use_enc_block_cmd,
TASK_GAPM、TASK_APP、,
gapm_使用_enc_block_cmd);
cmd->operation=GAPM\u USE\u ENC\u块;
memcpy(cmd->operand_1,app_env.key,16);
memcpy(cmd->operand_2,app_env.plaintext,16);
//发送消息
发送消息(cmd);
}
其次,我进行一些打印,并设置一个标志以指示加密已完成。
int gapm_use_enc_block_ind_handler(ke_msg_id_t msgid,
结构gapm使用enc块ind*参数,
ke_task_id_t dest_id,
ke_任务\u id_t src_id)
{
arch_printf(“数据加密cpl\r\n”);
app_env.enc_in_use=false//该标志用于指示加密模块现在处于空闲状态
app_adv_stop()//加密完成,停止播发以更新数据
返回(已消耗的热量);
}
最后,我检查app_env.enc_in_use标志并等待加密模块空闲,然后发送另一个加密命令
无效应用程序设置开发配置完成功能(无效)
{
ke_状态_集(任务_应用程序,应用程序可连接);
app_adv_start();
while(应用程序环境附件正在使用)//检查标志并等待加密模块空闲
app_env.enc_in_use=true//加密模块忙
//发送加密命令
结构gapm_use_enc_block_cmd*cmd=KE_MSG_ALLOC(gapm_use_enc_block_cmd,
TASK_GAPM、TASK_APP、,
gapm_使用_enc_block_cmd);
cmd->operation=GAPM\u USE\u ENC\u块;
memcpy(cmd->operand_1,app_env.key,16);
memcpy(cmd->operand_2,app_env.plaintext,16);
//发送消息
发送消息(cmd);
}
结果是加密模块无法工作,代码正在执行(app_env.enc_in_use);总是当然,同时也不打印任何内容。
但是在我对行while(app_env.enc_in_use)进行注释之后;在void app_set_dev_config_complete_func(void)中,加密模块工作正常并成功打印“数据加密cpl”。
如您所见,在初始化过程之后,我需要执行两个加密操作。

有什么建议吗?
你好
while(应用程序环境附件正在使用)//检查标志并等待加密模块空闲
请记住,整个系统是非先发制人的。一旦while循环启动,整个系统就会被while循环阻塞。
所以正在使用的app_env.enc_将不会更新。因此代码可能会以死锁告终。我认为这就是正在发生的事情。
@对话,谢谢,但我还有一个问题。系统中的中断(由定时器、外部引脚信号等引起)是否也是非抢占式的?
你好,打断是先发制人的。但任务(任务应用程序、任务GAPC等)不是先发制人的。
你解决了我的问题,谢谢。
你能给我更详细的解释一下DA14580的中断系统吗?最近,我遇到了一个奇怪的问题,即外部中断有时无法检测到。谢谢
例如,使用GLOBAL_INT_DISABLE()和GLOBAL_INT_RESTORE()对是否有任何副作用?
你好,summer20100514,
没有关于中断系统的特定文档,您可以就此向ARM手册提出建议。
谢谢你的对话