在下面的程序中,代码行的含义是什么
fnRAM_code((volatile unsigned char *)FLASH_STATUS_REGISTER); //从SRAM执行命令在下面的代码部分。我有 …
这看起来像旧的恩智浦(前飞思卡尔/摩托罗拉)HCS08,HCS12或Coldfire。在这些设备上,编写闪存驱动程序时有不同的情况:要么可以从闪存执行,要么不能。这完全取决于程序闪存属于哪个“库”:通常,您无法从当前正在编程的同一闪存库中执行MCU上的代码。
理想情况下,您将闪存编程代码放在另一个库中,但有些设备只有一个闪存库。然后,他们通过执行RAM中的代码来提供解决方案,这是一种快速和简单的方法。脏修复。
通常他们通过提供一系列原始数据操作码来解决这个问题。这个操作码数组被复制到RAM,然后它们设置一个指向RAM地址的函数指针。我猜测 fnRAM_code 就是这样一个函数指针。该 (volatile unsigned char *)FLASH_STATUS_REGISTER 部分只是传递闪存状态寄存器的地址。可能,FLASH_STATUS_REGISTER与FSTAT同义。
fnRAM_code
(volatile unsigned char *)FLASH_STATUS_REGISTER
该 uDisable_Interrupt(); 和 uEnable_Interrupt(); 应该对应 asm SEI 和 asm CLI 分别阻止所有可屏蔽中断在闪存写入期间触发,这可能导致写入失败或程序挂起。
uDisable_Interrupt();
uEnable_Interrupt();
asm SEI
asm CLI
应该有应用笔记可以详细描述所有这些。
请注意,此代码非常接近硬件,并依赖于大量定义不明确的行为。除了Codewarrior编译器之外,我不会指望它按预期编译。例如,gcc会发出许多严格的别名错误。