工具/软件:TI-RTOS
晚上都很好
我遇到了一个问题、即当 ISR 已启动时、128k 全局缓冲区阵列或已调用缓冲区的前56个字节会损坏。 但是、如果我将该缓冲区移动为局部缓冲区、问题就会消失。
所述代码是与 LWIP 一起运行的 FTP 客户端。 我们使用的是定制 AM335x PCB、CCS v6.1.1.00022、SYS/BIOS v642335、XDC 工具 v331024_CORE。 我已经尽量减少代码、我仍然可以看到错误、因此只运行 FTP 和 LWIP ISR、并且我可以告诉您、只有在 FTP 任务中的此代码期间触发 ISR 时才会发生损坏 GP_FTP_buffer 或 MlsdBuffer 类中的缓冲区会导致损坏。
fs_fread ((uint8_t *) gp_ftp_buffer、BTR、&br、ftp_instance->file_read); //sys_prot_t hwi_state = sys_arch_protect (); ftp_instance->mlsdBuffer->push (push_ftp_buffer、br); if (gpgp_instance-=&trbt )=&trbt 3&trbt ![fpf-ngpf-ngpf-ngpref!=&tract=&nbs=&trb&tract=&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb&trb %.2x %.2x"、(int)gp_ftp_buffer[3]、(int)buf[3]; ftp_instance->dbg_file_start = 1; fp_instance->tx_state = sm_ftp_transfer_in_limbo; } //sys_arch_unprotect (hwi_state);
正如我说过的、如果我将缓冲区移动到本地、问题就会发生、但这是一个非常大的应用、我们已经看到了其他可能与之相关或可能与之无关的损坏、因此我想了解这个问题的底部、并了解什么 发生的情况。
我已排除:
- 通过检测损坏发生的位置并引入延迟来使 ISR 调用在不同位置发生、任务代码的任何特定部分都是导致损坏的原因。
- 堆栈或堆会通过其在存储器映射中的位置溢出、观察到它周围没有任何东西会损坏、并使所有堆栈和堆加倍以确保安全。
我剩下的是怀疑这与高速缓存相关、以及我如何设置高速缓存/使用高速缓存的方式不是线程安全的。 当我在 DDR3区域的 MMU 设置中禁用高速缓存或将可缓冲设置为 false 时、我没有观察到任何损坏、但是性能很差、LWIP 会保持报告断言并最终断开连接。 这种解释听起来是否可行? 如果是、我可以在不影响性能的情况下尝试阻止损坏吗?
以下是我在项目 cfg 文件中设置 MMU 和高速缓存的方法:
var 高速缓存= xdc.useModule('ti.sysbios.family.arm.a8.Cache');
var MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
//启用高速缓
存。enableCache = true;
//启用 MMU (L1/L2数据高速缓存所需)
MMU。enableMMU = true;
//强制外设段为不可高速缓存
var peripheralAttrs ={
键入:MMU.FirstLevelDesc_section,//段描述符
TEX:0、
可缓冲:false,//可缓冲
可高速缓存:false,//可高速缓存
可共享:false,//可共享
NoExecute:true,//不可执行
};
//为地址范围中的每个条目设置描述符
对于(var i=0x44000000;i < 0x8000000000;i = i + 0x00100000){
//每个“描述符”条目跨越1MB 地址范围
Mmu.setFirstLevelDescMeta(i、i、peripheralAttrs);
}
//描述符属性结构
VAR attrs ={
键入:MMU。FirstLevelDesc_section、//段描述符
TEX:0x1、
可缓冲:真、 //可缓冲
可高速缓存:true、 //可缓存
};
//为地址范围中的每个条目设置描述符
对于(var i=0x80000000;i < 0x90000000;i = i + 0x00100000){
//每个“描述符”条目跨越1MB 地址范围
Mmu.setFirstLevelDescMeta(i、i、atttrs);
}
如果我现在不知道该去哪里、如果有任何关于我所做的错误的建议、我将不胜感激。
谢谢
肖恩