Microblaze 安全复位
ISSUSES
VIVADO SDK 2018.3 Microblaze 软核复位后应用程序执行异常
VIVADO SDK 2018.3 Microblaze 软核复位后应用程序不执行
VIVADO SDK 2018.3 Microblaze 复位后 malloc/calloc 返回空指针
DESCRIPTION
Microblaze 复位时 BRAM 中数据会保留,CPU 复位后,应用程序将从复位向量处开始执行,.data 段用来存放程序中已初始化的全局变量和静态变量,其中的变量在程序运行后可能被修改,若程序运行需要依赖变量的初始值,则每次复位后都可能导致产生不可预测的结果
SOLUTION
Method 1
将程序复制到外部的非易失存储器内,在运行时重新将 .data 段拷贝到 RAM 中,具体见 article 30878
Method 2
修改链接脚本将程序的 .data 段复制一份,运行时从备份地址拷贝一份
lscript.ld
.data : AT ( __data_load ) {
. = ALIGN(4);
__data_start = .;
*(.data)
*(.data.*)
*(.gnu.linkonce.d.*)
__data_end = .;
}
...
__data_load = .;
main.c
extern unsigned char __data_load_size, __data_start, __data_end, __data_load;
//...
int main()
{
memcpy((&__data_start), (&__data_load), ((&__data_end) -(&__data_start) + 1));
//...
}
Related Links
malloc returns null pointer after microblaze reset
30878 - 13.1 EDK - My Software Application Operates Improperly after a CPU Reset
How to safely reset or restart execution from application on Microblaze