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.

[参考译文] MSP430F5659:控制器功能的奇数行为

Guru**** 2533270 points
Other Parts Discussed in Thread: MSP430F5659

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/839752/msp430f5659-odd-behavior-of-controller-functionality

器件型号:MSP430F5659

您好!

我们使用的 MSP430F5659具有512KB 内存大小和64KB RAM。

对于我们的应用、我们使用具有以下设置的 IAR IDE:
代码模型:大型
数据模型:大型
双精度型浮点大小:32位
优化:低

在开发过程中、我们面临以下场景数据损坏问题:
在具有5个输入参数的函数之一中、在简单的 if 条件执行中、局部变量数据损坏、而未进行数据修改。
观察结果:在本地寄存器中分配了损坏的变量、这意味着本地寄存器损坏。
解决方案:经过一些试验后、我们修复了上述问题、将函数参数用作结构指针。
包含5个成员的结构(除先前函数的5个参数数据外没有其他内容)。

示例:
问题:
void func (arg1、arg2、arg3、arg4、arg5)

本地1;
本地2;
local3 = arg4;
local4 = arg5;

if (条件)-------- >此行执行后,local3被破坏


local1 = arg2;

解决方案:
结构{
arg1;arg2;arg3;arg4;arg5;

void func (struct *数据)

本地1;
本地2;
local3 = data->arg4;
local4 = data->arg5;

if (条件)-------- >执行此行后,local3未损坏


local1 =数据->arg2;

查询:请对此进行评论、函数参数是否存在任何限制。 因为我们在4个参数的函数中遇到了相同的问题。
对于参数小于4的函数、它是正常的。
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

2其中一个函数值表示不起作用。
观察结果:我们将值从函数输入参数指针成员分配给全球指针成员。
在赋值时、我们可以观察到函数输入参数指针成员中的正确值、
但是、在分配给全球指针成员值后、该值会移位8位。
解决方案:在调试过程中、我们发现在单字节可格式变量解密之后、发现了此问题。
在将可全局变量解解密从单字节更改为字字节时、工作正常。
示例:
问题:
文件1:
unsigned char glob_data;

void func()

使用变量--> glob_data 执行 JOD;

------------------------------------------------------------------

文件2:
结构1

Member1;Member2;... member30;

结构2.

Member1;Member2;... member30;


struct 1 * ptR_globb;
void func (strcut2 *数据)

ptR_glob->member4 = data->member4;--- > data->member4保留值01 --> 0x01

做其他工作;---- >data->member4保留值256--> 0x0100,它的值应为0x01

------------------------------------------------------------------

解决方案:
文件1:
unsigned int glob_data;

void func()

使用变量--> glob_data 执行 JOD;

------------------------------------------------------------------

文件2:
结构1

Member1;Member2;... member30;

结构2.

Member1;Member2;... member30;


struct 1 * ptR_globb;
void func (strcut2 *数据)

ptR_glob->member4 = data->member4;--- > data->member4保留值01 --> 0x01

做其他工作;---- >data->member4保留值01 --> 0x01,这是预期的

------------------------------------------------------------------

查询:需要了解内存对更改全局变量大小的影响。
我们观察到不同的行为、例如即使在24位移位的情况下也分配了值、在进行可变大小调整后、如上例所示、它是固定的。
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

3.包含或删除部分代码时不可预测的行为。
观察结果:删除/添加部分代码、其中不包含任何数据相关逻辑。 应用程序运行不正常。
解决方案:如果在删除代码时出现问题、则再次添加代码以正常工作。 添加代码时的情况相同。


第1和第2个问题一直在观察、因为在应用开发的早期阶段、代码存储器大小超过100KB (代码+ Const 存储器)、数据存储器高于16KB。
在第3个问题中、我们更频繁地进行处理、目前我们的应用使用的代码存储器为390KB (代码+ Const 存储器)、数据存储器为24KB。

以下是当前映射文件的一部分:

(二
**
*按地址顺序排列*
**
(二


段空间起始地址结束地址大小类型 align
===== === =================== =========== =========
DATA16_AN 0102 - 0103 2版本0
015C - 015D 2.
016C - 016F 4.
0224 - 0225 2.
022A - 022B 2.
0340 - 0341 2.
03C0 - 03C3 4.
03D2 - 03D3 2.
03E0 - 03E1 2.
049C - 049D 2.
04A0 - 04A1 2.
04AE - 04AF 2.
05DE - 05E1 4.
05E6 - 05E7 2.
05EA - 05EA 1.
05EC - 05EC 1.
05EE - 05EE 1.
05FC - 05FD 2.
061E - 0621 4.
0626 - 0627 2.
062A - 062A 1.
062C - 062C 1.
062E - 062E 1.
063C - 063F 4.
065E - 0661 4.
0666 - 0667 2.
066A - 066A 1.
066C - 066C 1.
066E - 066E 1.
0672 - 0673 2.
067C - 067D 2.
0700 - 0703 4.
070A - 070B 2.
0710 - 0710 1.
0720 - 0721 2.
CODE_I 2400版本1
DATA20_I 2400 - 4605 2206版本1
CSTACK 6360-63FF A0版本1
CSTART 8000 - 8037 38版本1
ISR_code 8038 - 8247 210版本1
1 8248 - FF7F 7D38版本1
INTVEC FF80 - FFF7 78 com 1.
复位 FFFE - FFFF 2版本1
2 00010000 - 0004524D 3524E 版本1
DATA20_C 0004524E - 00064FB2 1FD65版本1
DATA20_ID 00064FB4 - 000671B9 2206版本1
CODE_ID 000671BA 版本1
DATA20_Z 000F0000 - 000F3B8B 3B8C 版本1
DATA20_N 000F3B8C 版本1

(二
**
*交叉参考的末尾*
**
(二

250 440字节代码内存
24 114字节数据存储器(+ 74绝对值)
139 115字节 const 存储器


请帮助我们、并与我们分享您的解决方案/想法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Krishna、

    感谢您的详细博文。  我仍在进行讲解、所以可能会在这里有一些回答。   

    对于#1:参数数量是否有限制?  

    不、没有限制。  《MSP430编译器 v18.1.0用户指南 》的第6.4节介绍了编译器在函数调用时如何处理参数。  基本上、前几个参数在寄存器 R12-R15中传递。  加法参数被压入"参数块"中的栈。   

    因此、这里唯一实际的限制应该是堆栈大小。   

    谢谢、

    JD

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我刚才意识到您正在使用 IAR。  IAR 有自己的编译器、可能会以不同于上述 MSP 编译器的方式处理参数数据的传递。  我会参考有关这方面的 IAR 文档。  

    2。 这对我来说并不是很清楚。  您对本地数据和全局数据都使用 char 数据类型、并将其复制到全局变量中会损坏本地数据或指针?   如果您使用 int 或 short 数据类型、则此行为会消失?

    在调试和单步执行指令时、您应该能够查看汇编代码。  我认为这有望显示正在发生的情况。    

    这些是奇怪的问题、但所有这些问题似乎都与编译器相关。  我将把这个话题留给社区中的任何人进行评论、但我建议与 IAR 联系以获得有关这些主题的支持。  

    谢谢、

    JD   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 JD 的支持。

    虽然、我在 IAR 论坛上针对您提出的这个编译器问题提出了一个请求。 等待响应。

    正如您所说的、我们将保持开放状态、以便其他专家对此提供支持。

    到目前为止、我们使用了400KB 的512KB 大小。 这是否会造成问题??? 理想情况下、MSP430F 控制器应该使用多少%的内存?

    我们在上面只指出了几个看法,但我们实际面临的许多问题。 我们通过采用上述不同的方法来解决少数问题。

    但想知道这种奇怪行为的根本原因。  

    是 MSP430内存使用/映射还是编译器问题。  

    谢谢、

    Krishna

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Krishna、

    从和 MSP430的角度来看、使用可用闪存的每个字节没有问题。 某些部分可能已经被保留、但这将记录在数据表中、并在提供的链接器文件中进行说明。  

    编译器/链接器将告诉您您的项目是否适合某个位置。  

    谢谢、

    JD  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 JD。

    但是、它不会引发任何链接器问题。 它的编译很顺利。 但在运行时、它的行为错误。

    该控制器是否存在任何对齐问题。 当将单个变量添加到结构中时、它在某种程度上起作用、而有时不起作用。

    从任何其他设置中、我们是否可以解决这些问题。

    控制器的行为有很大不同。  

    谢谢、

    Krishna

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JD、您好!

    是否有以下问题的更新?

    谢谢、

    Krishna

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Krishna、

    很抱歉、我错过了您的其他问题。  如果您的数据可能是字节对齐的并且您使用字对齐的指令、似乎会出现一些对齐问题。   

    在以下主题中有一个恰当的讨论: https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/127319?Data-alignment-in-MSP430f5419 

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/96154

    MSP430优化 C/C++编译器用户指南中提供了更多详细信息、请访问 :http://www.ti.com/lit/ug/slau132r/slau132r.pdf 

    谢谢、

    JD