你好,
我使用Basic Kit的DSPS示例代码作为起点,并添加了几行简单的代码,以从手机DSPS应用程序接收不同类型的消息。
手机向Basic Kit发送不同类型的消息。下面是我在user_sps_scheduler.c中更改代码以检测消息类型的函数的代码片段:
Static void uart_tx_callback(uint8_t res)
{
静态uint8_t大小= 0;
uint8_t * peripher_tx_ptr = NULL;
*hdr = (ptr *);
//当isr不运行时,从uart传输isr或应用程序调用函数
开关(res)
{
案例UART_STATUS_OK:
//获取数据和指针
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 (periph_tx_ptr + sizeof (NearEyeProtHdr) size-sizeof (NearEyeProtHdr) &uart_tx_callback);
返回;
}
//在缓冲区中没有数据,因此回调完成
callbackbusy = false;
}
Neareye_protocol.h文件有以下内容:
的ifndef _NEAREYE_PROTOCOL_H_
#定义_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我可以设置断点切换实例块和uart_sps_write()和每个角色我发送我可以进入额外的代码。你放置断点的额外的代码(在开关的情况下或在uart_sps_write)如果你只放置一个断点在回调= false行也许你正在看一个额外的调用uart_tx_callback()(第一次返回的函数被称为它如果(大小> 0)和perhapas有第二次吗调用uart_tx_callback,其中大小为0,因此函数返回callback = false)。
由于MT_dialog
我就怕你会这么说。我将断点插入if(size>0),并尝试进入switch{}块。我意识到,从电话发送的每条消息都有2次调用这个函数。
在这里我注意到的一件事是,当我处于调试模式时,在这个switch代码块中的任何行上设置一个断点,都会导致断点带有一个感叹号。这告诉我代码在运行时不会被访问。我能设置断点的唯一一行是:
uart_sps_write (periph_tx_ptr + sizeof (NearEyeProtHdr) size-sizeof (NearEyeProtHdr) &uart_tx_callback);
因此,我添加到DSPS代码库的任何新代码都不会被识别。到目前为止,那是我唯一搞过的地方。由于当前switch语句实际上不执行任何操作,因此调用uart_sps_write()并将字符输出到终端,无论是否添加指针偏移大小(NearEyeProtHdr)都没有问题。
在hardfault_handler.c中,我还从电话发送了一条消息,触发了HardFault_HandlerC()。是我发送的字节流里的什么东西导致了这个吗?
谢谢,
——潘文凯
我注意到了一件事。当构建代码时,有或没有代码的开关块会导致
程序大小:Code=15336 RO-data=2424 RW-data=72 ZI-data=10200。
这有意义吗?我认为程序大小应该与添加开关块不同。
谢谢,
——潘文凯
我还比较了带有和不带有切换代码块的HEX文件。有一些差异,但文件的长度(大小)是相同的。有开关块的十六进制文件的大小不应该比没有开关块的十六进制文件的大小多,因为应该有更多的指令行代码生成,因此十六进制文件的大小应该更大?
谢谢,
——潘文凯
嗨kqtrinh,
断点的事实显示为灰色,这就意味着你有插入的代码编译从凯尔.hex文件生成,也可以验证的事实的大小和编译的数据来自两个具有相同的大小。这让我得出结论,你的代码的优化不是-O0,开关的情况时应排除在构建多o0优化使用(因为你有提到你已经改变了优化级别——我假设你去“目标选项”选择“C / c++”选项卡并改变了优化从那里)你再次编译程序吗?我可以得到你提到的优化大于-O0的结果。同样,你提到的程序大小是相当小的一个,我得到没有优化。对于硬故障,有很多原因导致ARM到达那个点,如对内存的非对齐访问等。
由于MT_dialog
奇怪。我刚才检查了优化级别,设置为-O3。几天前我选择了-O0,不知道为什么会回到-O3。它现在正在工作,并且显然是有意义的,代码的开关块被优化了,因为它实际上还没有做任何事情。
谢谢你对我袒露心声。
——潘文凯