工具与软件:
运行 psim2024生成的代码时、我发现了一个奇怪的问题。 CCS 程序的单步执行和持续运行的结果是不一致的!
如图所示、在我的程序中 i9=(I1-2.5)*20、i14=i9、连续运行的结果是完全错误的、设置断点时单步运行的结果是正确的。
PS:
1. 我没有打开编译器优化
2.数据为浮点型,错误与数据类型无关
3.使用 volatile 关键字修改数据也是无效的
其他条件如下:
仿真器:XDS100V1
控制器:F28335
CCS 版本:ccs6.1.3


This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
运行 psim2024生成的代码时、我发现了一个奇怪的问题。 CCS 程序的单步执行和持续运行的结果是不一致的!
如图所示、在我的程序中 i9=(I1-2.5)*20、i14=i9、连续运行的结果是完全错误的、设置断点时单步运行的结果是正确的。
PS:
1. 我没有打开编译器优化
2.数据为浮点型,错误与数据类型无关
3.使用 volatile 关键字修改数据也是无效的
其他条件如下:
仿真器:XDS100V1
控制器:F28335
CCS 版本:ccs6.1.3


我想补充一点信息:我的程序在编译后总是有一个警告,因为它不会影响程序的操作,所以我忽略了它,如下所示:
1.#10063-D 除"_c_int00"以外的入口点符号:"code_start"
2.#99922 C:\Users\licai\AppData\Local\Temp\023602:.debug_FRAME 段()中偏移量为0x00000192的 FDE 的 CIE 引用0xff0000无效
3.无法解析生成变量"XDAIS_CG_ROOT"。
4.无效的项目路径:未找到包含路径(\packages\ti\xDAIS)。
这些警告是否会影响我的程序的正确性?
您好!
我怀疑您遇到了一个已知问题:
https://sir.ext.ti.com/jira/browse/EXT_EP-10722
请检查 调试器存储器映射 、然后查看是否将访问大小设置为 AS2。 如果是、您可以按照上述链接中所述将其设置为 AS4。
谢谢
Ki
我将 GEL 文件中唯一的 AS2更改为 AS4、但问题仍未解决。
我注意到您更改了 PF2的访问大小、即0x7000 - 0x7FFF
不过、显示的变量位于地址0x9E**。 因此、看起来你需要更改 L1 SARAM 的访问大小。
[quote userid="624140" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1429846/tms320f28335-f28335-ccs-code-running-problem-the-results-of-single-step-and-continuous-running-of-the-ccs-program-are-inconsistent ccs 版本:ccs6.1.3另请注意、您正在使用非常旧且不受支持的 CCS 版本。 我建议更新到最新版本。
如果方便、请您详细解释如何更改 L1 SARAM 的访问大小?
这与您的屏幕截图中配置 PF2的方式相同。 使用 GEL_MapAddStr 对 L1 SARAM 执行相同的操作
这只会影响监视表达式窗口中的观察到的值吗?或者我的真实值是否也是错误的?
监视表达式显示的值不正确、因为它会在不同的时间读取浮点值的两半。 当目标停止时、这不是问题。 但在以持续刷新进行实时访问时、监视表达式会显示一个"介于"(In Between)值、其中只有一半被更新。
很抱歉,因为出差,我花了这么长的时间来回复您。
现在、我可以确认造成问题的不是调试器内存映射、而是延迟。 但问题依然存在
以下是用于生成 PSIM 的 CCS 程序框架:
中断空 Task()
{
………
DELAY_MS (10ms)//只有在此处添加了延迟时、此值才是正确的
fADC3 = PSM_AdcGetValBySoc(0)*(1 * 3.0/4096);//从 ADC_A0获取直流值。
fADC3_1 = PSM_AdcGetValBySoc(1)*(1 * 3.0/4096);//从 ADC_A1获取直流值。
fADC3_2 = PSM_AdcGetValBySoc(2)*(1 * 3.0/4096);//从 ADC_A2获取直流值。
fADC3_3 = PSM_AdcGetValBySoc(3)*(1 * 3.0/4096);//从 ADC_A3获取直流值。
..........
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 中断服务例程设置为20kHz。 它每20kHz 周期调用一次。
空初始化()
{
...
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 重复该过程。 它会初始化硬件。
void main ()
{
initialize();
ps_EnableIntr ();//启用全局中断 INTM
ps_EnableDbgm();
对于(;;){
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 编译主程序。 它会调用初始化例程、并运行无限循环。
仅当在 Interrupt void Task()中的数模转换之前添加延迟时、程序才能正常运行、但仅当延迟大于10ms 时才可以正常运行。 但是、此延迟对于我的开关周期来说太长、从而导致我的闭环反馈出现问题。 我应该怎样解决它?
现在我可以确认、不是调试器内存映射导致了问题
您是否尝试过针对正确的存储器范围更改属性?
我问,因为:
仅当在 Interrupt void Task()中的数模转换前添加延迟、但延迟大于10ms 时、程序才能正确运行。 但是、此延迟对于我的开关周期来说太长、从而导致我的闭环反馈出现问题。 我应该如何解决?
最初出现的与调试器存储器映射相关的问题可能会导致时序问题。 就像您提到的一样。 问题是、如果将默认的16位访问大小用于存储器范围、则对变量值的存储器读取将在两个操作和一个正在运行的器件上完成、具体取决于时序、该值可能会在这两个操作的中间发生变化、从而导致变量的值无效。 通过延迟将系统减速会降低发生这种情况的可能性、从而使变量显示正确的值。
您所描述的一切都与我提到的前一个问题是一致的。 因此、我想确认您是否为正确的存储器范围设置了正确的存取大小。
谢谢
Ki
是的、我尝试了您提供的方法、结果仍然是相同的连续运行时数据结果错误
热菜单 F28335_F28335_ Memory_Map ()
{
GEL_MapReset ();
GEL_MapOn ();
/*程序存储器映射*/
GEL_MapAddStr (0x0,0、0x400、"R|W|AS4"、1);/* M0 SARAM *
GEL_MapAddStr (0x400、0、0x400、"R|W|AS4"、1);/* M1 SARAM *
GEL_MapAddStr (0x4000、0、0x1000、"R|W|AS4"、1);/*区域0 */
GEL_MapAddStr (0x8000、0、0x1000、"R|W|AS4"、1);/* L0 SARAM *
GEL_MapAddStr (0x900、0、0x1000、"R|W|AS4"、1);/* L1 SARAM *
GEL_MapAddStr (0xA000、0、0x1000、"R|W|AS4"、1);/* L2 SARAM *
GEL_MapAddStr (0xB000、0、0x1000、"R|W|AS4"、1);/* L3 SARAM *
GEL_MapAddStr (0xC000、0、0x1000、"R|W|AS4"、1);/* L4 SARAM *
GEL_MapAddStr (0xD000、0、0x1000、"R|W|AS4"、1);/* L5 SARAM *
GEL_MapAddStr (0xE000、0、0x1000、"R|W|AS4"、1);/* L6 SARAM *
GEL_MapAddStr (0xF000、0、0x1000、"R|W|AS4"、1);/* L7 SARAM *
GEL_MapAddStr (0x100、0、0x100000、"R|W|AS4"、1);/*区域6 */
GEL_MapAddStr (0x200、0、0x100000、"R|W|AS4"、1);/*区域7 */
GEL_MapAddStr (0x300、0、0x40000、"R|W|AS4"、0);/* FLASH */
GEL_MapAddStr (0x380080、0、0x00009、"R|W|AS4"、0);/* ADC_cal function*/
GEL_MapAddStr (0x380090、0、0x00001、"R|W|AS4"、0);/* PARTID 值*/
GEL_MapAddStr (0x380400、0、0x00400、"R|W|AS4"、0);/* OTP *
GEL_MapAddStr (0x3f8000、0、0x1000、"R|W|AS4"、1);/* L0 SARAM 镜像*
GEL_MapAddStr (0x3f900、0、0x1000、"R|W|AS4"、1);/* L1 SARAM Mirror */
GEL_MapAddStr (0x3fA000、0、0x1000、"R|W|AS4"、1);/* L2 SARAM Mirror */
GEL_MapAddStr (0x3fb000、0、0x1000、"R|W|AS4"、1);/* L3 SARAM Mirror */
GEL_MapAddStr (0x3fe000、0、0x2000、"R|W|AS4"、0);/* boot ROM */
/*数据存储器映射*/
GEL_MapAddStr (0x000、1、0x400、"R|W|AS4"、1);/* M0 SARAM *
GEL_MapAddStr (0x400、1、0x400、"R|W|AS4"、1);/* M1 SARAM *
GEL_MapAddStr (0x800、1、0x1800、"R|W|AS4"、1);/* PF0 *
GEL_MapAddStr (0x4000、1、0x1000、"R|W|AS4"、1);/*区域0 */
GEL_MapAddStr (0x5000、1、0x1000、"R|W|AS4"、1);/* PF3 *
GEL_MapAddStr (0x6000、1、0x1000、"R|W|AS4"、1);/* PF1 */
GEL_MapAddStr (0x70、1、0x1000、"R|W|AS4"、0);/* PF2 *
GEL_MapAddStr (0x8、1、0x1000、"R|W|AS4"、1);/* L0 SARAM *
GEL_MapAddStr (0x900、1、0x1000、"R|W|AS4"、1);/* L1 SARAM *
GEL_MapAddStr (0xA000、1、0x1000、"R|W|AS4"、1);/* L2 SARAM *
GEL_MapAddStr (0xB000、1、0x1000、"R|W|AS4"、1);/* L3 SARAM *
GEL_MapAddStr (0xC000、1、0x1000、"R|W|AS4"、1);/* L4 SARAM *
GEL_MapAddStr (0xD000、1、0x1000、"R|W|AS4"、1);/* L5 SARAM *
GEL_MapAddStr (0xE000、1、0x1000、"R|W|AS4"、1);/* L6 SARAM *
GEL_MapAddStr (0xF000、1、0x1000、"R|W|AS4"、1);/* L7 SARAM *
GEL_MapAddStr (0x100、1、0x100000、"R|W|AS4"、1);/*区域6 */
GEL_MapAddStr (0x200、1、0x100000、"R|W|AS4"、1);/*区域7 */
GEL_MapAddStr (0x300、1、0x40000、"R|W|AS4"、0);/* FLASH */
GEL_MapAddStr (0x380400、1、0x00400、"R|W|AS4"、0);/* OTP *
GEL_MapAddStr (0x380080、1、0x00009、"R|W|AS4"、0);/* ADC_cal function*/
GEL_MapAddStr (0x380090、1、0x00001、"R|W|AS4"、0);/* PARTID 值*/
GEL_MapAddStr (0x3f8000、1、0x1000、"R|W|AS4"、1);/* L0 SARAM 镜像*
GEL_MapAddStr (0x3f900、1、0x1000、"R|W|AS4"、1);/* L1 SARAM Mirror */
GEL_MapAddStr (0x3fA000、1、0x1000、"R|W|AS4"、1);/* L2 SARAM Mirror */
GEL_MapAddStr (0x3fb000、1、0x1000、"R|W|AS4"、1);/* L3 SARAM Mirror */
GEL_MapAddStr (0x3feed000、1、0x2000、"R|W|AS4"、0);/* boot ROM */
}
我还尝试将其限制在有问题的存储器范围内、结果值得怀疑。 感谢您的帮助、我将为您提供我的整个项目文件。 希望您身体健康、一切都顺利!
e2e.ti.com/.../soft_2D00_switching_2D00_3.0-_2800_C-code_2900_.zip