你好,
我使用Basic Kit的DSPS示例代码作为起点,并添加了几行简单的代码,以从手机DSPS应用程序接收不同类型的消息。
手机会向基本套件发送不同类型的信息。下面是我在user_sps_scheduler.c中更改代码以检测消息类型的函数的代码片段:
Static void uart_tx_callback(uint8_t res)
{
静态uint8_t大小= 0;
uint8_t * peripher_tx_ptr = NULL;
NearEyeProtHdr*hdr=(NearEyeProtHdr*)外围设备发送ptr;
//当isr不运行时,从uart传输isr或应用程序调用函数
开关(res)
{
情况UART\u状态\u正常:
//获取数据和指针
Size = user_peripher_pull (& peripher_tx_ptr, Size);
打破;
案例UART_STATUS_INIT:
size = user_buffer_read_address(& ble_to_peripher_buffer, & peripher_tx_ptr, TX_CALLBACK_SIZE);
打破;
默认值:
ASSERT_ERROR (0);//从未知源调用回调函数
}
//如果有可用数据,请通过外围设备发送数据
如果(大小> 0)
{
//如果在QPI中显示的数据为peripher_tx_ptr中的“Text
//或实际的QPI命令,通过查看头中的消息类型
开关(hdr - > msgType)
{
//这是来自电话的短信或讲话
案例1:
//这是一个电话号码或短信
案例2:
打破;
//这是一个QPI命令到QPI
案例3:
打破;
默认值:
打破;
}
//跳过NearEye协议头,这是获得CI msg的前5个字节
//将CI消息发送至UART至QPI。目前,我们不打算尝试
//发送到协议头中指定的特定QPI
uart_sps_write(外围发送ptr+sizeof(NearEyeProtHdr)、sizeof(NearEyeProtHdr)和uart_发送回调);
返回;
}
//在缓冲区中没有数据,因此回调完成
callbackbusy=false;
}
Neareye_protocol.h文件有以下内容:
的ifndef _NEAREYE_PROTOCOL_H_
#定义(近眼)(协议)_
typedef struct {
uint8_t msgType;
uint8_t qpiSelect;
uint8_t brdSelect;//当前设计中没有使用
uint8_t resv0;//保留将来使用
uint8_t resv1;//保留将来使用
} NearEyeProtHdr;
# endif / / _NEAREYE_PROTOCOL_H_
Keil编译并构建了一个新的十六进制二进制,优化级别设置为0。当我启动调试器并在if行(大小> 0)设置断点时,当消息发送到时,它就会到达断点。Size的值是0x10。然而,跳到下一行代码将跳过此块消息检测检查,并进入callbackbusy = false;
我试过几种不同的方法,但都没有成功。我还尝试了闪烁修改的代码思考时,板出现,它将启动从flash和这是我将调试事件,虽然我知道,当运行调试器,调试器将加载代码直接到SRAM并执行。
如果你知道原因,请告诉我。或者,如果你不介意,你可以看看我的代码,我有非常快的设置,你会看到我在说什么。也许这不会发生在你身上,因为你的设置环境可能和我的不一样。
谢谢
——潘文凯
嗨kqtrinh,
我尝试了你提到的,只是应用了你贴在帖子上的代码,并将优化级别设置为-O0。我可以在switch case块和uart_sps_write()中设置断点,对于我发送的每个字符,我都可以进入附加代码。如果仅在callback=false行中放置断点,是否在附加代码中放置断点(在开关情况下或在uart_sps_write中)可能您正在观看uart_tx_callback()的附加调用(第一次调用函数时,它从if返回(大小>0)可能还有第二次调用uart_tx_回调,其中大小为0,因此函数返回callback=false)。
由于MT_dialog
我就怕你会这么说。我将断点插入if(size>0),并尝试进入switch{}块。我意识到,从电话发送的每条消息都有2次调用这个函数。
这里我注意到的一件事是,当我处于调试模式时,在这个开关代码块内的任何行上设置断点将导致断点变灰,并带有感叹号。这告诉我,代码在运行时将无法访问。我唯一可以设置断点的行是:
uart_sps_write(外围发送ptr+sizeof(NearEyeProtHdr)、sizeof(NearEyeProtHdr)和uart_发送回调);
因此,我添加到DSPS代码库的任何新代码都不会被识别。到目前为止,那是我唯一搞过的地方。由于当前switch语句实际上不执行任何操作,因此调用uart_sps_write()并将字符输出到终端,无论是否添加指针偏移大小(NearEyeProtHdr)都没有问题。
在hardfault_handler.c中,我还从电话发送了一条消息,触发了HardFault_HandlerC()。是我发送的字节流里的什么东西导致了这个吗?
谢谢
——潘文凯
我确实注意到一件事。什么时候building the code, with or without the switch block of code results in
程序大小:代码=15336 RO数据=2424 RW数据=72 ZI数据=10200。
这有意义吗?我认为程序大小应该与添加开关块不同。
谢谢
——潘文凯
我还比较了带有和不带有切换代码块的HEX文件。有一些差异,但文件的长度(大小)是相同的。有开关块的十六进制文件的大小不应该比没有开关块的十六进制文件的大小多,因为应该有更多的指令行代码生成,因此十六进制文件的大小应该更大?
谢谢
——潘文凯
嗨kqtrinh,
断点灰显这一事实意味着插入的代码是从keil生成的.hex文件中编译出来的,这也可以通过两个编译的大小和数据大小相同的事实来验证。这让我得出这样的结论:代码的优化不是-O0,当使用了超过-O0的优化时,应该从构建中排除切换情况(因为您提到您已经更改了优化级别-我想您应该转到“目标选项”选择“C/C++”选项卡并从那里更改优化)你把程序重新编译了吗?当优化大于-O0时,我可以得到您提到的结果。另外,您提到的程序大小比我得到的没有优化的程序小得多。关于硬故障,ARM达到该点的原因有很多,如对内存的无误访问等。
由于MT_dialog
奇怪的我刚才检查了优化级别,它被设置为-O3。几天前我选择了-O0,但不知道为什么它会返回到-O3。它现在可以工作了,而且代码的开关块已经优化了,因为它还没有做任何事情。
谢谢你和我在一起。
——潘文凯