繁体   English   中英

变量随机变化,极其奇怪的行为

[英]Variables randomly changing, extremely odd behavior

我正在经历变量随机变化的极其奇怪的行为。

我将其提炼为最简单的示例, encoder_1_positionencoder_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 声明的。

volatile不会像您认为的那样做。 更详细。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM