你好,
我遵循SAMPLE128 doc,对它进行了修改,添加了新的特性等等。
现在我需要知道我应该从应用程序任务向任务概要发送什么消息来更新特征(在示例特征2中)。
在这个例子中,我看到了更新特征2的两个函数:
///已连接状态处理程序定义。
const struct ke\u msg\u handler sample128\u connected[]=
{
{GATTC\ u WRITE\ u CMD\ u IND,(ke\ u msg\ u func\ t)GATTC\ u WRITE\ u CMD\ u IND\ u handler},
{SAMPLE128\u UPD\u CHAR2\u REQ,(ke\u msg\u func\t)SAMPLE128\u UPD\u CHAR2\u REQ\u handler},
};
我假设GATTC\u WRITE\u CMD\u IND是要发送的正确消息,但我不明白为什么还有SAMPLE128\u UPD\u CHAR2\u REQ,其中有一个检查连接处理程序:
//检查提供的值
如果(param->conhdl==gapc\u get\u conhdl(trelettra_环境控制信息.conidx公司)
如何从应用程序任务正确设置conhdl?是否正确使用样本128\u UPD\u CHAR2\u REQ?
设备:
SAMPLE128\u UPD\u CHAR2\u REQ是要在更新特征值时使用的。当中央通过BLE向DA14580发送写入命令时,系统会将GATTC\ U WRITE\ U CMD\ U IND(指示用IND)发送到配置文件任务。
好 啊。谢谢。
我可以通过中断程序从任务应用程序向他自己发送消息吗?
我试着用定时器中断每300毫秒读取一个传感器。所以我在periph\u设置中定义了一个回调函数:
定时器寄存器回调(定时器中断函数);
为了提高系统响应,在定时器中断功能中不执行传感器读数。所以我决定将消息从TASK_APP发送到TASK_APP(他自己),在那里消息处理程序执行读取。在app\u myproject.c中定义:
void timer0\中断\功能(void){
//给自己发信息
struct myproject\u read*cfm=KE\u MSG\u ALLOC(myproject\u read,TASK\u APP,TASK\u APP,myproject\u read);
发送消息(cfm);
}
应用程序\默认\状态处理程序中声明的处理程序id:
{MYPROJECT\u READ,(ke\u msg\u func\t)MYPROJECT\u READ\u handler},
而且消息枚举在myproject_task.h中与概要文件的其他消息一起定义。
此外,myproject\u read\u处理程序在app\u myproject\u task中声明和定义。
但是,当我运行调试器时,系统在kemsg ALLOC行的timer0\u interrupt\u函数上循环运行。
有什么问题吗?
如果发送没有参数的消息,可以使用更简单的函数ke\u msg\u send\u basic:
keu msg\u send\u basic(MYPROJECT\u READ,TASK\u APP,TASK\u APP);
在处理程序中,“param”参数的类型应为const void*。
如果消息发送在中断中无法正常工作,请在调用ke\u msg\u send\u basic之前使用以下代码唤醒BLE系统:
如果(GetBits16(CLK\ U RADIO\ U REG,BLE\ U ENABLE)==0){//BLE时钟关闭
SetBits16(GP\ U CONTROL\ U REG,BLE\ U WAKEUP\ U REQ,1);
}
不起作用。在这里循环
0x000009CE 4B0D LDR r3,[pc,#52];@0x00000A04
0x000009D0 881A LDRH r2,[r3,#0x00]
0x000009D2 4B0D LDR r3,[pc,#52];@0x00000A08
0 x000009d4 0491 lsl r1, r2, # 18
0x000009D6 D402 BMI 0x000009DE
0x000009D8 6858 LDR r0,[r3,#0x04]
0x000009DA 2800 CMP r0,#0x00
0x000009DC D0F7 BEQ 0x000009CE
在我按下停止按钮(我使用uVision 5)后,在那里循环。用ke\u msg\u send\u basic指令运行代码到断点,然后按一行键,代码不停止。我需要按停止按钮来停止执行。在那之后,代码在那里循环。
我重新启动uVision并断开/r连接设备。重新执行代码,直到断点(ke\u msg\u send\u basic)。现在一步一步执行指令,但光标从C代码窗口消失,只有反汇编窗口显示光标。继续执行某些指令,直到出现J-link cortex-M错误警报:
“无法停止Cortex-M设备!请检查jtag电缆“
在命令窗口上:
Jlink错误无法读取寄存器9
Jlink错误无法读取寄存器10
...
我认为问题是从中断例程发送消息不起作用。我不知道为什么。
我用中断例程设置的全局变量重写了代码,全局变量在main函数上被检查,这里消息被发送到task应用程序。这样就行了。