[英]Variables randomly changing, extremely odd behavior
我正在经历变量随机变化的极其奇怪的行为。
我将其提炼为最简单的示例, encoder_1_position
和encoder_2_position
使用__enable_irq
function 中的随机值进行更新。 我已经对文件中的全局变量的声明进行了重新排序,我注意到它对于添加什么/是否添加垃圾会有所不同。 此后,我在 linker 命令中禁用了“删除未使用的部分”,它似乎解决了问题(显然 BSS 部分被丢弃了),但我不明白为什么,特别是因为我拥有的每个全局变量都是用 volatile 声明的。
我正准备打破一些东西。
#include "sam.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "math.h"
#define HEAP_SIZE 0x500
#define STACK_SIZE 0x2500
void IntializeWatchdogTimer(void)
{
// disable watchdog timer
WDT->WDT_MR = WDT_MR_WDDIS;
}
void InitializeUart(void)
{
PMC->PMC_PCER0 = PMC_PCER0_PID8;// ID_UART 8
// baud rate is 84Mhz/(16*45) = 116667
UART->UART_BRGR = uint32_t(45);
// set to no parity
UART->UART_MR = UART_MR_PAR_NO;
// Enable transmit and receive
UART->UART_CR = UART_CR_TXEN|UART_CR_RXEN;
// Enable UART control of port A pin 8, 9
PIOA->PIO_PDR = PIO_PER_P8|PIO_PER_P9;
// Enable UART interrupt on RX RDY
UART->UART_IER = UART_IER_RXRDY;
// Set priority
NVIC_SetPriority(UART_IRQn,2);
NVIC_EnableIRQ(UART_IRQn);
}
#define RX_buffer_size 1000
#define TX_buffer_size 1000
volatile char UART_rx_buffer[RX_buffer_size];
volatile int UART_rx_buffer_load_index = 0;
volatile int UART_rx_buffer_read_index = RX_buffer_size-1;
volatile int message_ready = 0;
volatile char UART_tx_buffer[TX_buffer_size];
volatile int UART_tx_buffer_load_index = 0;
volatile int UART_tx_buffer_sent_index = TX_buffer_size-1;
volatile int encoder_1_position = 0;
volatile int encoder_2_position = 0;
int main(void)
{
/* Initialize the SAM system */
char* RX_message;
char TX_message[1000];
__disable_irq();
SystemInit();
IntializeWatchdogTimer();
InitializeUart();
__enable_irq();
while (true)
{
encoder_1_position +=1;
encoder_2_position +=1;
}
}
为了提供正在发生的事情的具体示例,我们在调试器视图中看到一步更改 encoder_1_position
我在 linker 命令中禁用了“删除未使用的部分”,它似乎解决了问题(显然 BSS 部分被丢弃了)
这只是一个猜测,但这可能意味着您的程序加载器没有正确处理 BSS 部分。 它应该分配memory区域并将 linker 分配给 BSS,即使没有位可以从可执行映像复制到该范围。 (它比这更复杂一点,但除非你自己编写加载程序,否则应该给你足够的想法。)
但我不明白为什么特别是因为我拥有的每个全局变量都是用 volatile 声明的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.