在基本套件上添加自定义SW到DSPS外设模式

7个帖子/ 0个新
最后一篇
kqtrinh.
离线
最后一次露面:4年5天前
加入:2016-08-24 00:17
在基本套件上添加自定义SW到DSPS外设模式

你好,

我正在使用DSPS示例代码与基本套件作为我的起点,并添加了几行简单的代码,以从手机DSP应用程序接收不同的消息类型。

手机向Basic Kit发送不同类型的消息。下面是我在user_sps_scheduler.c中进行代码更改以检测消息类型的函数的代码片段:

静态void UART_TX_CALLBALL(UINT8_T RES)
{
静态UINT8_T大小= 0;
uint8_t * periph_tx_ptr = null;
NearEyeProtHdr *hdr = (NearEyeProtHdr *) peripheral _tx_ptr;

//在未运行时从UART传输ISR或应用程序调用函数
开关(RES)
{
案例UART_STATUS_OK:
//获取数据和指针
size = user_periph_pull(&periph_tx_ptr,size);
休息;
案例UART_STATUS_INIT:
size = user_buffer_read_address(&ble_to_periph_buffer,&periph_tx_ptr,tx_callback_size);
休息;
默认:
assert_error(0);//错误:从未知来源调用回调
}
//如果有可用的数据,发送数据通过periph
if(size> 0)
{
//确定periph_tx_ptr中的数据是否在qpi中显示“文本”
//通过查看标题中的消息类型来或实际QPI命令
开关(HDR-> MsgType)
{
//这是手机的文本或演讲
情况1:
//这是一个电话号码或短信
案例2:
休息;
//这是QPI的QPI命令
案例3:
休息;
默认:
休息;
}
//跳过附近的协议标题,该标题是前5个字节以获得CI MSG
//发送CI消息到UART到QPI。现在,我们不打算尝试
//发送到协议标题中指定的特定QPI
uart_sps_write (periph_tx_ptr + sizeof (NearEyeProtHdr) size-sizeof (NearEyeProtHdr) &uart_tx_callback);
返回;
}

//缓冲区中没有数据,因此回调已完成
callbackbusy = false;
}

附近的文件有以下内容:

#ifndef _neareye_protocol_h_
#定义_NEAREYE_PROTOCOL_H_

typedef struct {
uint8_t msgType;
UINT8_T QPISELECT;
uint8_t brdselect;//不用于当前设计
UINT8_T RESV0;//储备未来使用
UINT8_T RESV1;//储备未来使用
近期普及;

#endif // _neareye_protocol_h_
keil编译并建立了一个新的十六进制二进制,优化级别设置为0.当我启动调试器并在行时设置一个断点(大小> 0)时,它会在发送消息时点击断点。大小的值为0x10。但是,踩到下一行代码将跳过此块消息检测检查并落在CallbackBusy = False中;

我尝试了几种不同的方式,没有运气。我也尝试闪烁的修改后的代码思考,当电路板提出时,它会从Flash启动,这就是我将要调试的事件,虽然我知道在运行调试器时,调试器将直接加载到SRAM并执行。

如果你知道为什么,请告诉我。或者如果你不介意,你能看看我的设置真正快速的代码,你会看到我在谈论什么。也许它不会为您而发生,因为您的设置环境可能与我的不同。

谢谢,
- khai

设备:
mt_dialog.
离线
最后一次露面:4个月2周前
职员
加入:2015-06-08 11:34
嗨kqtrinh,

嗨kqtrinh,

我已经试过你提到的,只是应用的代码已经贴在你的文章,并将优化级别设置为o0我可以设置断点切换实例块和uart_sps_write()和每个角色我发送我可以进入额外的代码。你放置断点的额外的代码(在开关的情况下或在uart_sps_write)如果你只放置一个断点在回调= false行也许你正在看一个额外的调用uart_tx_callback()(第一次返回的函数被称为它如果(大小> 0)和perhapas有第二次吗调用uart_tx_callback,其中大小为0,因此函数返回callback = false)。

谢谢mt_dialog.

kqtrinh.
离线
最后一次露面:4年5天前
加入:2016-08-24 00:17
这就是我害怕的东西

这就是我害怕的是你会说的。我在if(size> 0)上插入断点,并尝试进入交换机{}块。我意识到每条消息中有2个函数的调用。

这里我注意到的一件事是,当我处于调试模式时,在此switch代码块内的任何行上设置断点将导致断点被灰化,其中有一个感叹号。这告诉我,当它运行时,不会到达代码。我能够设置断点的唯一一行是:

uart_sps_write (periph_tx_ptr + sizeof (NearEyeProtHdr) size-sizeof (NearEyeProtHdr) &uart_tx_callback);

因此,不再识别任何添加到DSPS代码库的新代码。到目前为止,这是我笨拙的地方。由于当前的Switch语句实际上没有,因此调用UART_SPS_WRITE()并将字符写入终端没有问题,或不添加指针偏移尺寸(附近的PORTEPSDR)。

此外,我还从HardFault_Handler.c中触发HardFault_Handlerc()的手机发送了一条消息。它是在我送到这件造成这个的字节流中的东西吗?

谢谢,
- khai

kqtrinh.
离线
最后一次露面:4年5天前
加入:2016-08-24 00:17
我注意到一件事。当

我注意到一件事。在构建代码时,有或没有交换机代码块会导致

程序大小:Code=15336 RO-data=2424 RW-data=72 ZI-data=10200。

那有意义吗?我认为程序规模应与交换机块添加不同。

谢谢,
- khai

kqtrinh.
离线
最后一次露面:4年5天前
加入:2016-08-24 00:17
我还比较了内置的HEX

我还将建于内部的十六进制文件与交换机块进行了比较。存在差异,但文件长度(大小)是相同的。不应该带有交换机块的十六进制文件大小超过那个没有,因为应该有更多的指令行生成的代码,因此十六进制文件大小应该更大?

谢谢,
- khai

mt_dialog.
离线
最后一次露面:4个月2周前
职员
加入:2015-06-08 11:34
嗨kqtrinh,

嗨kqtrinh,

断点的事实显示为灰色,这就意味着你有插入的代码编译从凯尔.hex文件生成,也可以验证的事实的大小和编译的数据来自两个具有相同的大小。这让我得出结论,你的代码优化不是-O0,开关的情况时应排除在构建多o0优化使用(因为你有提到你已经改变了优化级别——我假设你去“目标选项”选择“C / c++”选项卡并改变了优化从那里)你再次编译程序吗?当优化大于-O0时,我可以得到你提到的结果。同样,你提到的程序规模是相当小的一个,我得到没有优化。关于硬故障,有许多原因导致ARM达到这个点,对内存的非对齐访问等。

谢谢mt_dialog.

kqtrinh.
离线
最后一次露面:4年5天前
加入:2016-08-24 00:17
奇怪。我检查了这一点

奇怪。我刚才检查了优化级别,它被设置为-O3。几天前我选择了-O0,不知道为什么它会回到-O3。它现在是工作的,而且绝对有意义的是,代码的switch块被优化了,因为它真的没有做任何事情。

谢谢你对我袒露。
- khai