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.

[参考译文] CCS/MSP430F4152:变量由系统更改

Guru**** 2527670 points
Other Parts Discussed in Thread: MSP430F4152

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/604171/ccs-msp430f4152-variable-is-changed-by-system

器件型号:MSP430F4152

工具/软件:Code Composer Studio

您好!

这是我下面的代码、我有一个问题、我不知道如何解决、plz 帮我解决。

问题是系统将更改我的变量。

如何解决? 我可以声明 RAM 区域吗? 我能不能使用 MSP430的寄存器、例如 R15、R14……

代码尚未完成。

我的代码:

//
//*用于控制 Panasonic Minas、获取 loadcell 值和位置信息*
//*模式1通过 UART (BR=9600)、*与 PC 一起工作
//* PC control FSA325和 FSA325 control Minas *
//*
///*-------------------------------------------------------- *
//*|<模式1 >------------------------------------------ |*
//*||<模式1 >-------- ||*
//*|--- |--- 正弦脉冲--- |--- ||||*
//*||||| |=========== >|驱动程序|=>||Panasonic ||||*
//*||||| |--- || Minas ||||*
//*||| UART |||||| ||||*
//*|||模式/信息||||---- ||||*
//*|| PC |=== || FSA325 |位置信息||计数器|||||*
//*|||运行/停止||||================================ |||||| |*
//*||||| | loadcell value |-------- ||||*
//*||| loadcell ||||================================ || loadcell ||||*
//*|||<==== |||||| ||||*
//*|--- 位置|--- |--- ||||*
//*||--- ||*
//*|---------------------------------- |*
///*-------------------------------------------------------- *
//
#include "msp430f4152.h"
#include "interface.h"

#define kP1 1.
define kP2 2.
#define kP3 3.
#define kP4 4.
#define kP5 5.
#define kP6 6.
#define EE2464Address 0x50
#define Command_UP 0x10
#define Command_DOWN 0x11
#define Command_Zero 0x12
#define Command_ORIGINAL 0x15
#define Command_Jog 0x18
#define Command_SET_POSITION 0x19
#define Command_UP_DOWN 0x1A
#define Command_Stop 0x00
#define TXD_OK 0x00

//typedef unsigned char u8t;
//typedef unsigned short u16t;

unsigned int Loadcell_value;//测量 loadcell 的计数
unsigned int flash_state;//检查闪存中的数据是否可用
unsigned int lcd_page;//1=PC master
unsigned int TX_LOOP;
unsigned int RX_LOOP;
无符号短整型 TX_DATA[100];
无符号短整型 RX_DATA[100];
unsigned short operation_command;
无符号短整型 RX_FLAG;
无符号短整型 PULSE_STAT;
签署的长期立场;

空蜂鸣音(int beep time_time);
空延迟(int time);//10ms
//*******
//*计时器*
//*******
void Timer_set (void);
//*****
//* UART *
//*****
void TX_DATA_Transform (void);
void RX_DATA_OPERATION (void);
void SET_UART (void);
//********
//*电机*
//********
void Minas 操作(无符号短接模式);//0=stop 1=up 2=down
//********
//* loadcell *
//********
void value_Loadcell (void);//get value loadcell
//*******
//* FLASH *
//*******
void Check_initialize (void);
void get_flash_value (void);
void Save_flash_value (void);
/*****
//* LCD *
/*****
void inited_lcd (void);
void LCD_POS (unsigned char LCD_X、unsigned char LCD_Y);
void Write_Command (unsigned char 命令);
空忙(空);
void databus (unsigned char Data);
void Write_Data (无符号字符数据);
void LCD_Page_choose (unsigned int Page);
void LCD_Page1 (void);//PC 主设备
//********
//*键盘操作*
//********
void KeyOP (void);
无符号字符键盘(void);

void main (void)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
//********
//*初始化*
//********
check_initialize();//get flash data and check if loadin default value (检查是否以默认值加载)
inition_lcd();
//================================
蜂鸣音(1);
//*********
//*主循环*
//*********
while (1)

KeyOP();
value_Loadcell();
LCD_Page_Choose (LCD_Page);
开关(LCD_Page)

案例1://PC 主设备
if (RX_FLAG = 0)
RX_DATA_OPERAT();
中断;


空 Timer_set (空)

//设置定时器0
TA0CCTL0 = CCIE;// CCR0中断被启用
TA0CCR0 = 300;
TA0CTL = MC_0;// SMCLK、停止、清除 TAR
_bis_SR_register (GIE);
//设置定时器1
TA1CTL = tassel_0 + MC_2 + TACLR;//TACLK、向上计数模式、清除 TAR

void RX_DATA_OPERATION (void)

无符号短循环;
operation_command=RX_data[1];
switch (operation_command)//command

案例 Command_Stop:
Minas 操作(0);
中断;
案例 Command_Up:
Minas 操作(1);
中断;
案例 Command_Down:
Minas 操作(2);
中断;
案例 Command_Zero:
中断;
案例 Command_Original:
中断;
案例 Command_Jog:
中断;
案例 Command_SET_POSITION:
中断;
案例 Command_UP_DOWN:
中断;

//*******
//*重置标志和数据*
//*******
RX_LOOP=0;
RX_FLAG=1;
for (loop=0;loop<100;loop++)

RX_DATA[LOOP]=0;

TX_DATA_Transform ();

void TX_DATA_Transform (void)

switch (operation_command)

案例 Command_Up:
案例 Command_Down:
TX_DATA[0]= 0x03;
TX_DATA[1]= OPERATION_COMMAND;
TX_DATA[2]= TXD_OK;
中断;
案例 Command_Zero:
中断;
案例 Command_Original:
中断;
案例 Command_Jog:
中断;
案例 Command_SET_POSITION:
中断;
案例 Command_UP_DOWN:
中断;

//*********
//* TX 操作*
//*********
TX_LOOP = 0;
IE2 |= UCA0TXIE;//启用 USCI_A0 TX 中断
//UCA0TXBUF = TX_DATA[0];

void Minas 操作(无符号短接模式)//0=stop 1=up 2=down

开关(模式)

情况0://stop
TA0CTL = tassel_2 + MC_0 + TACLR;//停止
中断;
案例1://up
P2OUT &=~符号;
TA0CTL = tassel_2 + MC_1 + TACLR;// SMCLK、停止、清除 TAR
中断;
案例2://down
P2OUT |=符号;
TA0CTL = tassel_2 + MC_1 + TACLR;// SMCLK、停止、清除 TAR
中断;

//***键盘***
//------ SNAP KP1 -> O <-自动 KP2
//| LCD |向上 KP3 -> O <-向下 KP4
//------ FUNC KP5 -> O <- Memo KP6
空键盘(空)

unsigned char temp;
temp=keypad();
如果(temp=kP1)//snap

蜂鸣音(1);
Minas 操作(0);

//==========================================================================================
if (temp=kP2)//auto

蜂鸣音(1);
Minas 操作(1);

//==========================================================================================
if ((temp=kP3)&&(LCD_Page=1))//up

蜂鸣音(1);
Minas 操作(2);

//==========================================================================================
if ((temp=kP4)&&(LCD_Page=1))//down

//蜂鸣音(1);

//==========================================================================================
if ((temp=kP5)&&(LCD_Page=1)//func

//蜂鸣音(1);

//==========================================================================================
if (temp=kP6)//备注

//蜂鸣音(1);

无符号字符键盘(void)

unsigned char keycode、temp;
volatile unsigned i、j;
对于(i=0;i<250;i++);
keycode=0;//重置键码
TEMP=~(P4IN)& 0x07;
如果(temp!=0)

开关(温度)

案例 PG1:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG1)
键码=kP1;
中断;
PG3案例:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG3)
keycode=kP3;
中断;
案例 PG2:
对于(i=0;i<130;i++);
TEMP=~(P4IN)& 0x07;
if (temp==PG2)
键码=kP2;
中断;


TEMP=~(P2IN)& 0XE0;
如果(temp!=0)

开关(温度)

PG4案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG4)
keycode=kP4;
中断;
PG5案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG5)
keycode=kp5;
中断;
PG6案例:
对于(i=0;i<130;i++);
TEMP=~(P2IN)& 0XE0;
if (temp==PG6)
键码=kP6;
中断;


返回密钥代码;

void LCD_Page_choose (无符号整页)

switch (页面)

案例1:
LCD_Page1 ();
中断;

void inited_lcd (void)

延迟(1);//10ms
WRITE_COMMAND (0x38);
延迟(1);//10ms
WRITE_COMMAND (0x01);//CLEAR
延迟(1);//10ms
WRITE_Command (0x0C);//显示打开,禁用光标
延迟(1);//10ms
WRITE_COMMAND (0x06);
WRITE_COMMAND (0x02);
P4DIR |= BL_EN;
P4OUT &=~BL_EN;//背光打开

void LCD_Page1 (void)//PC 主设备

无符号短循环0、循环1;//用于显示循环
无符号短环3、环4;
无符号短整型数据[10];
unsigned char table[4][16]={
//0 1
//0123456789012345
{"FVE MTR+Loadcell"}、
{" Loadcell:1024"}、
{"模式:PC 主机"}、
{""}
};
//*********
//*更改数据*
//*********
DATA[0]= Loadcell_value;
//loadcell
DATA[1]=DATA[0]%10;//1.
DATA[0]/=10;
DATA[2]=DATA[0]%10;//10
DATA[0]/=10;
data[3]=data[0]%10;//100
DATA[4]=DATA[0]/10;//1000
loop4=14;//字符数组
for (loop3=1;loop3<5;loop3++)// value 数组

开关(DATA[loop3])

情况0:
表[1][loop4]='0';
中断;
案例1:
表[1][loop4]='1';
中断;
案例2:
表[1][loop4]='2';
中断;
案例3:
表[1][loop4]='3';
中断;
案例4:
表[1][loop4]='4';
中断;
情况5:
表[1][loop4]='5';
中断;
案例6:
表[1][loop4]='6';
中断;
案例7:
表[1][loop4]='7';
中断;
案例8:
表[1][loop4]='8';
中断;
案例9:
表[1][loop4]='9';
中断;
默认值:
表[1][loop4]='-';
中断;

环4-;

//*******
//*清除无意义的0 *
//*******
if (table[1][11]='0')

表[1][11]=';
if (table[1][12]='0')

表[1][12]=';
if (table[1][13]='0')
表[1][13]=';


//========================================================================================
//Write_Command (0x01);//clear
//========================================================================================
for (loop0=0;loop0<4;loop0++)

LCD_POS ((loop0+1)、0);
for (loop1=0;loop1<16;loop1++)

WRITE_Data (table[loop0][loop1]);


空 Write_Data (无符号字符数据)

BUSY();
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT |= RS;
P1OUT &=~RW;
_NOP();
数据库(数据);
_NOP();
P7OUT |=启用;
_NOP();
_NOP();
_NOP();
P7OUT &=~使能;
P1OUT |= RW;

void LCD_POS (unsigned char LCD_X、unsigned char LCD_Y)

unsigned char pos;
如果(LCD_X=1)
LCD_X=0x80;
否则、如果(LCD_X==2)
LCD_X=0x90;
否则(LCD_X==3)
LCD_X=0x88;
如果(LCD_X==4)则为其他值
LCD_X=0x98;
POS=LCD_X+LCD_Y;
Write_Command (pos);

void Write_Command (无符号字符命令)

BUSY();
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT &=~Ω(RS+RW);
databus(命令);
_NOP();
_NOP();
P7OUT |=启用;
_NOP();
_NOP();
_NOP();
P7OUT &=~使能;
P1OUT |= RW;

空忙(空)

P5DIR &=~DB7;
P1DIR |= RS+RW;
P7DIR |=启用;
P1OUT &=~RS;
P1OUT |= RW;
P7OUT |=启用;
while (P5IN&DB7);//忙
P7OUT &=~使能;

空数据库(无符号字符数据)

unsigned char i;
unsigned char temp;
I=0;
对于(i=0;i<8;i++)

开关(I)

情况0:
P5DIR |=DB0;
TEME=0;
临时+=Data&0x01;
如果(temp&0x01)
P5OUT |= DB0;
其他
P5OUT &=~DB0;
中断;
案例1:
P5DIR |=DB1;
TEME=0;
临时+=Data&0x02;
如果(temp&0x02)
P5OUT |= DB1;
其他
P5OUT &=~DB1;
中断;
案例2:
P5DIR |=DB2;
TEME=0;
温度+=Data&0x04;
如果(temp&0x04)
P5OUT |= DB2;
其他
P5OUT &=~DB2;
中断;
案例3:
P5DIR |=DB3;
TEME=0;
温度+=Data&0x08;
IF (temp&0x08)
P5OUT |= DB3;
其他
P5OUT &=~DB3;
中断;
案例4:
P5DIR |=DB4;
TEME=0;
临时+=Data&0x10;
如果(temp&0x10)
P5OUT |= DB4;
其他
P5OUT &=~DB4;
中断;
情况5:
P5DIR |=DB5;
TEME=0;
临时+=Data&0x20;
如果(temp&0x20)
P5OUT |= DB5;
其他
P5OUT &=~DB5;
中断;
案例6:
P5DIR |=DB6;
TEME=0;
温度+=Data&0x40;
如果(temp&0x40)
P5OUT |= DB6;
其他
P5OUT &=~DB6;
中断;
案例7:
P5DIR |=DB7;
TEME=0;
临时+=Data&0x80;
如果(temp&0x80)
P5OUT |= DB7;
其他
P5OUT &=~DB7;
中断;


空蜂鸣音(int beep time_time)

volatile unsigned int i、j;
开关(哔声时间)

案例0://long beep
对于(j=0;j<600;j++)

P1OUT |= BZ;//蜂鸣器打开
for (i=0;i<15;i++);
P1OUT &=~BZ;//缓冲器关闭
for (i=0;i<15;i++);

中断;
默认值://beep 表示"beep time"时间
for (;beep_tim>0;beep_time--)

对于(j=0;j<200;j++)

P1OUT |= BZ;//蜂鸣器打开
for (i=0;i<15;i++);
P1OUT &=~BZ;//缓冲器关闭
for (i=0;i<15;i++);

对于(j=0;j<100;j++)

对于(i=0;i<48;i++);
对于(i=0;i<48;i++);


中断;

空延迟(int time)//10ms

int i、j;
int delay_time;
for (delay_time=0;delay_<time;Delay_time++)

for (i=0;i<50;i++)

for (j=0;j<30;j++)

_NOP();



空 Check_initialize (空)

unsigned short clear_loop;
//********
//*初始化*
//********
RX_FLAG=1;
RX_LOOP=0;
TX_LOOP=0;
Loadcell_value=0;
operation_command=0;
PULSE_STAT=0;
位置= 0;
for (clear_loop=0;clear_loop<100;clear_loop++)

RX_DATA[CLEAR_LOOP]=0;
TX_DATA[CLEAR_LOOP]=0;

get_flash_value ();
如果(flash_state!= 0xF0)//默认情况下、如果闪存中没有数据

LCD_Page=1;
save_flash_value();

Set_UART();
timer_set();
//***
//*设置 I/O *
//***
P1DIR |= BZ;//输出
P2DIR |=符号;
P3DIR |=脉冲;
P3SEL |=计数;
P6SEL |= RXD + TXD;//P6.5、6 = USCI_A0 RXD/TXD

void SET_UART (void)

volatile unsigned int i;
//********
//*设置 UART *
//********
FLL_CTL0 |= XCAP11PF;//配置负载电容
操作

IFG1 &=~OFIFG;//清除 OSCFault 标志
对于(I = 0x47FF;I > 0;I-);//设置标志的时间

while ((IFG1 & OFIFG));// OSCFault 标志仍然置1?

UCA0CTL1 |= UCSSEL_1;// CLK = ACLK
UCA0BR0 = 0x03;// 32k/9600 - 3.41
UCA0BR1 = 0x00;
UCA0MCTL = 0x06;//调制
UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
IE2 |= UCA0RXIE;//启用 USCI_A0 RX 中断
_bis_SR_register (GIE);

void value_Loadcell (void)

int i;
unsigned long Temp_value;
TEMP_VALUE = 0;
for (i=0;i<1000;i++)

ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;//ref 1.5v
//ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;//ref 2.5V
ADC10CTL1 = INCH_4;//设置 ADC 端口 A4。
ADC10CTL0 |= ENC + ADC10SC;//采样和转换开始
temp_value += ADC10MEM;//get value from loadcell
ADC10CTL0 &=~ENC;

TEMP_VALUE /= 1000;
Loadcell_value = Temp_value;//获取 loadcell 的平均值

void get_flash_value (void)

unsigned int * Flash_ptr1;//check 初始化
unsigned int * Flash_ptr2;//系统
flash_ptr1=(unsigned int *) 0x1000;
flash_ptr2=(unsigned int *) 0x1001;

flash_state=*Flash_ptr1++;
LCD_Page=*Flash_ptr2++;

void Save_flash_value (void)

unsigned int * Flash_ptr1;//check 初始化
unsigned int * Flash_ptr2;//系统
flash_ptr1=(unsigned int *) 0x1000;
flash_ptr2=(unsigned int *) 0x1001;

FCTL1 = FWKEY + ERASE;//启用闪存中的擦除数据
FCTL3 = FWKEY;//解锁闪存
*Flash_ptr1=0;//擦除闪存数据
*Flash_ptr2=0;
FCTL1=FWKEY + WRT;//使能写入闪存中的数据
//********
//*将数据写入地址集的闪存*
//********
*Flash_ptr2+=LCD_Page;
*闪存_ptr1+=0xF0;
FCTL1=FWKEY;
FCTL3=FWKEY + LOCK;//锁定闪存

//*********
//* ADC10中断服务例程*
//*********
#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void)

_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除 CPUOFF 位

//
//* TXD 中断服务例程和 I2C 中断服务例程*
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0TX_vector
_interrupt void USCI0TX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCIAB0TX_vector)) USCI0TX_ISR (void)
其他
错误编译器不受支持!
#endif

UCA0TXBUF = TX_DATA[TX_LOOP++];// TX 下一个字符

如果(TX_LOOP = TX_DATA[0])// TX over?
IE2 &=~UCA0TXIE;//禁用 USCI_A0 TX 中断

//*********
//* RXD 中断服务例程*
//*********
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCIAB0RX_vector
_interrupt void USCI0RX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCIAB0RX_vector)) USCI0RX_ISR (void)
其他
错误编译器不受支持!
#endif

无符号短循环;
//*********
//* RXD 数据模式:length+command+data+...+0x00 *
//*********
//********
//*获取长度*
//********
if (RX_LOOP=0)
RX_DATA[0]= UCA0RXBUF;
//********
//*获取数据*
//********
if (RX_LOOP>=(RX_DATA[0]-1))//RXD

RX_FLAG=0;

RX_DATA[RX_LOOP]=UCA0RXBUF;
RX_LOOP++;
//*********
//*错误检查*
//*避免挤压*
//*或卡在 RXD 中断例程中*
//*********
如果(RX_FLAG=0)//当 RXD 翻转时、检查数据是否正确

if ((RX_DATA[RX_DATA[0]-1]!=0x00)||(LCD_Page!=1))//检查数据和模式
{//如果错误、清除数据和复位标志
RX_FLAG=1;
RX_LOOP=0;
for (loop=0;loop<100;loop++)
RX_DATA[LOOP]=0;


//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_A0_VECTOR
_interrupt void Timer_A (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (TIMER0_A0_vector)) Timer_A (void)
其他
错误编译器不受支持!
#endif

if (pulpulate_stat=0)

P3OUT &=~μ s 脉冲;
PULSE_STAT=1;

其他

P3OUT |=脉冲;
PULSE_STAT=0;

我的标题:

#ifndef interface_h_
#define interface_h_

//端口1
//#define P1_0 0x01
//#define P1_1 0x02
//#define P1_2 0x04
#define BZ 0x08
#define CS1 0x10 //LCD CS1
#define CS2 0x20 //LCD CS2
#define RS 0x40 //LCD DI
#define RW 0x80 //LCD RW

//端口2
#define 符号0x01
#define Ex4 0x02
#define EX3 0x04
#define Ex2 0x08
#define Ex1 0x10
#define PG6 0x20
#define PG5 0x40
#define PG4 0x80

//端口3
#define 复位0x01
#define SEL 0x02
#define P3_2 0x04
#define Count 0x08
#define Ex9 0x10
#define EX8 0x20
#define EX7 0x40
#define PULSE 0x80

//端口4
#define PG3 0x01
#define PG2 0x02
#define PG1 0x04
#define BL_EN 0x08
//#define P4_4 0x10
#define 踏板0x20
#define AC 0x40
#define DIRECTION 0x80

//端口5
#define DB0 0x01
#define DB1 0x02
#define DB2 0x04
#define DB3 0x08
#define DB4 0x10
#define DB5 0x20
#define DB6 0x40
#define DB7 0x80

//端口6
#define OV 0x01
#define SCL 0x02
#define SDA 0x04
#define OP_EN 0x08
#define Loadcell 0x10
#define RXD 0x20
#define TXD 0x40
//#define P6_7 0x80
#define I2C_PORT_SEL P6SEL
#define I2C_PORT_OUT P6OUT
#define I2C_PORT_REN P6REN
#define I2C_PORT_DIR P6DIR
#define SDA_PIN BIT2 // UCB0SDA 引脚
#define SCL_PIN BIT1 // UCB.S 引脚
#define SCL_CLOCK _DIV 0x12 // SCL 时钟偏差

//端口7
//#define P7_0 0x01
//#define P7_1 0x02
//#define P7_2 0x04
//#define P7_3 0x08
#define OC 0x10
//#define P7_5 0x20
#define 启用0x40
//#define P7_7 0x80

#endif /* interface_h_*/

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

    您好、Norton、

    我希望更好地了解您的问题、以便我们更好地帮助您:
    1.你说变量意外改变。 哪个变量已更改、预期值与故障情况/更改值之间的关系是什么?
    2.您能否确定值在程序或操作中的哪个点发生变化? 为了帮助实现这一点、您可以根据特定变量的变化甚至特定变量的变化来设置用于停止调试器的断点、而不是仅在特定代码地址上停止。 有关这一点的信息、请参阅 www.ti.com/.../slaa393上的"使用 EEM 与 CCSv6进行高级调试"
    3.观察.map 文件(在 CCS 中,您可以在项目的 Debug 文件夹中找到该文件)并找到您关注的变量的放置地址。 它是否接近您使用指针访问的内容、例如在您的 TX/RX 缓冲器等数组之后? 这可能表明在访问阵列时、可能会在某个位置出现一个"一对一"错误、这样您就可以将阵列的末尾写下来、而是覆盖变量值?

    此致、
    Katie

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

    由于某些原因、我必须在公司中使用 CCS4。
    变量、位置和一些其他变量都意外更改。 这是该项目的重要价值。
    我使用了断点和步进运算来观察变量、所有意外变化的变量都有一定的情况。
    这种情况是、变量在主子程序或中断服务例程中受控。
    一旦我调用包含一些私有变量声明的子项、这些变量就会发生更改。
    在我看来、我认为变量或运算的记忆被其他人所涵盖。 或者它们具有相同的地址。 因此、变量会更改为相同的值、但当我更改私有变量的初始化值时、意外更改的变量具有不同的值。
    所以我的问题是、是否有任何方法可以用来解决变量意外变化的问题?

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

    您使用 CCS4的一个问题是、如果这是由非常旧的编译器错误导致的、我不确定您将如何解决它...

    正如您说过的、您的变量似乎被其他变量覆盖。 可能是变量实际存储在寄存器中、具体取决于编译器是否需要保存它们、因此会被子例程吹扫。 您可以尝试将一些受影响的全局变量声明为易失性、以查看它们是否被保留。
    您可以做的另一件事是使用调试观察窗口来确定变量在被更改时存储在哪个地址(观察窗口应该显示值和地址)-它是表示它们位于寄存器中还是 RAM 地址中?
    查看显示受影响变量存储地址的.map 文件、并将问题发生时初始化的子例程变量与注释进行比较、您也可以检查这些地址是否存在冲突。

    最后、问题发生时、是在子例程中初始化的正常变量初始化、还是通过指针或直接在地址设置的某个内容? 当使用类似的指针时、很容易使地址离开、编译器也无法真正为您找到该地址。 或者、如果您没有以某种方式保留某个地址、例如使用链接器文件或其他方法、编译器可能已在该地址放置了一些内容、这可能会导致冲突。

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

    感谢您的申请。

    我的 CCS 版本太旧、无法解决某些问题。
    但现在、我已经找到了解决这个问题的方法。
    解决方法是减少我的变量。 我将一些变量组合在一起、现在系统不会更改我的变量。

    不过、我仍然必须为我的项目找到一种最佳方法。 非常感谢。

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

    如果减少变量的数量可以解决问题、它确实听起来像是某种存储器冲突。 我担心、随着您的计划的发展或变更、您可能会再次遇到相同的问题。 您可能需要检查变量在内存中的分配方式、并确保在项目设置中保留足够大的栈、以便不会出现栈溢出。

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

    非常感谢。 我将对此进行检查。

    此致、
    Norton