gpt4 book ai didi

c - 为什么 NOP/几行额外的代码/指针别名优化有帮助? [富士通MB90F543 MCU C代码]

转载 作者:行者123 更新时间:2023-11-30 17:20:05 26 4
gpt4 key购买 nike

我正在尝试修复 Fujitsu MB90F543 成熟程序中发现的错误。该程序至今运行了近10年,但人们发现,在某些特殊情况下,它一开始就未能做到两件事。其中之一至关重要。

低电平和高电平初始化(端口、引脚、外设、IRQ 处理程序)后,通过 SPI 从 EEPROM 读取配置数据,并且状态 LED 会打开一段时间(为了打开它们,数据会通过 SPI 发送到 LED 驱动器) )。当这些特殊情况首先发生且仅第一个函数调用时,仅少数 EEPROM 读取失败,另外一些本应点亮的 LED 也不会亮起。

该程序用 C 语言编写,并使用 Softune v30L32 编译。令人惊讶的是,在低级硬件 init 中添加单个 __asm("NOP ") 就足以使程序在上述情况下按预期工作。在优化设置中关闭“控制指针别名优化”就足够了。在不同的地方添加几行代码也有帮助。

我比较了带有和不带有 __asm("NOP ") 的版本以及带有上述优化器设置的编译程序的(DIFFed)ASM 列表,它们看起来都很好。

Softune编译器多年来在编译期间打印的唯一警告如下:

*** W1372L: The section is placed outside the RAM area or the I/O area (IOXTND)

我确实意识到这是一个相当普遍的问题,但也许有更大视野的人能够指出可能的原因。

您知道什么可能会导致这种奇怪的行为吗?如何定位bug并修复?

在初始化期间,使用了一些长(约20ms)延迟循环。尽管它们从大约 2ms​​ 增加,但它们没有帮助,但硬件初始化函数的任何行中的单个 NOP 甚至在函数之前或之后都有帮助。

两个等待循环都有效。我已经用示波器检查过了。 (我添加了 LED 在之前打开和之后关闭)。

我通过将 SPI 时钟从 1MHz 减慢至 500kHz 来检查时序假设。它不会改变任何东西。减慢至 250kHz 会使看门狗重置,因为代码的某些部分执行时间太长(>25ms)。

还有一件事。我观察到,在任何源文件中添加局部变量有时会使问题消失或重新出现。初始化未初始化的局部变量也是如此。在任何文件中添加几行额外的代码可以帮助或揭示问题。

void main(void)
{
watchdog_init();
// waiting for power supply to stabilize
wait; // about 45ms
hardware_init();
clear_watchdog();
application_init();
clear_watchdog();
wait; // about 20ms
test_LED();
{...}
}

void hardware_init (void)
{
__asm("NOP"); // how it comes it helps? - it may be in any line of the function
io_init(); // ports initialization

clk_init();
timer_init();
adc_init();

spi_init();
LED_init();
spi_start();
key_driver_init();
can_init();
irq_init(); // set IRQ priorities and global IRQ enable
}

最佳答案

可能是很多事情之一,但我想到了两件事。

时机。

也许等待时间不够长,电源无法稳定,并且并非所有内容都与时钟同步。 NOP 让一切恢复同步。

对齐。

也许 NOP 会让您的指令在硬件期望的 32 或 64 位边界上对齐。 (我们过去经常在大型机汇编器上这样做,因为 IO 操作通常期望事情在双字边界上)。

关于c - 为什么 NOP/几行额外的代码/指针别名优化有帮助? [富士通MB90F543 MCU C代码],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28686099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com