我正在研究项目da14580_dialog_beacons_3.40.2,我需要在必要时做一些加密工作。AES128模块正好运行,但我昨天发现了一个奇怪的问题。我做了一些操作如下。
我正在使用扩展的睡眠模式。
首先我在app_adv_func()中发送eapm_use_enc_block_cmd:
void app_adv_func(struct gapm_start_advertise_cmd * cmd)
{
//广告数据
//扫描响应数据
app_env.enc_in_USE = true; //加密moudule忙
//发送加密命令
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->操作数_1,app_env.key,16);
memcpy(cmd->操作数_2,app_env.plaintext,16);
//发送消息
ke_msg_send(cmd);
}
第二个我做了一些打印并设置一个标志以指示加密完成。
int gapm_use_enc_block_ind_handler(ke_msg_id_t msgid,
struct 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(); //加密完成,停止广告更新数据
return(ke_msg_consumed);
}
最后我检查app_env.enc_in_use标志并等待加密模块空闲,然后发送另一个加密cmd
void app_set_dev_config_complete_func(void)
{
ke_state_set(task_app,app_connectable);
app_adv_start();
while(app_env.enc_in_USE); //检查标志并等待加密Moudule空闲
app_env.enc_in_USE = true; //加密moudule忙
//发送加密命令
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->操作数_1,app_env.key,16);
memcpy(cmd->操作数_2,app_env.plaintext,16);
//发送消息
ke_msg_send(cmd);
}
结果是加密模块将无法正常运行,并且代码正在执行(app_env.enc_in_USE);每时每刻。同时,当然,没有什么。
但是在我发表评论之后(app_env.enc_in_USE);在void app_set_dev_config_complete_func(void)中,加密模块运行良好并成功打印“数据加密CPL”。
正如您所看到的,我需要在一些初始化过程后做两个加密操作。
有什么建议?
你好,
while(app_env.enc_in_USE); //检查标志并等待加密Moudule空闲
请记住整个系统是非先发制人的。一旦循环开始,整个系统就会通过循环阻止。
所以app_env.enc_in_USE不会更新。所以代码最终可能会在僵局中。我认为这是发生的事情。
@wt_dialog,谢谢,但我还有一个问题。中断(由定时器,外部引脚信号等)中的中断(由定时器,外部引脚信号等)也是非抢先的吗?
在那里,中断是先发制人的。但是任务(Task_App,Task_Gapc等)不是抢占者。
你解决了我的问题,谢谢。
您能否向我提供关于DA14580中断系统的详细解释?最近,我遇到了一个奇怪的问题,偶尔没有检测到外部中断。谢谢。
例如,使用global_int_disable()和global_int_restore()对存在任何副作用?
嗨Summer20100514,
中断系统没有特别的文档,您可以为此建议ARM手册。
谢谢mt_dialog.