Flash
IAP等同于OTA,写一个Bootloader程序存在程序更新不会覆盖的空间,需要更新时,程序跳转到bootloader入口,接收通信串口传送的新程序,控制Flash读写操作,将新程序移动值运行空间,最后跳转到新的程序进行运行或者直接系统复位
In-Circuit Programming 和 In-Application Programming
存储器映像
闪存模块组织
Flash结构
Flash解锁
使用指针访问存储器
volatile用于防止编译器优化某段必须执行的代码,虽然在编译器看来是无意义的(如:无意义的加减变量、)
Volatile关键字
volatile 关键字用于声明一个变量,指示编译器不要对该变量进行优化。具体来说,当一个变量被声明为 volatile 时,编译器会在每次使用该变量时都从内存中读取其最新值,而不是将其缓存到寄存器中。
-
主要用途
-
硬件寄存器访问:
访问硬件寄存器时,寄存器的值可能会被外部事件(如中断)改变。使用 volatile 可以确保每次读取的是最新的寄存器值。 -
多线程环境:
在多线程环境中,一个线程可能修改另一个线程正在使用的变量。使用 volatile 可以确保每个线程都能看到变量的最新值。 -
信号处理函数:
在信号处理函数中,全局变量的值可能会被信号处理器修改。使用 volatile 可以确保主线程能看到这些变化。 -
注意事项
-
不适用于所有情况:
volatile 并不能替代同步机制(如互斥锁、信号量)来解决多线程环境下的数据竞争问题。 -
性能影响:
使用 volatile 会导致编译器无法对其进行某些优化,从而可能影响性能。 -
原子性:
volatile 不保证对变量的操作是原子性的。对于需要原子操作的情况,应使用适当的同步原语。
程序存储器编程
程序存储页擦除
擦除的最小单位是1K,1024字节
PER: Page Erase
AR: 地址寄存器
闪存全擦除
MER: Mass Erase
STRT: Start
选项字节
RDP:读保护位, WRP: 写保护位
选项字节擦除
OPTWRE: Option Write Enable