1. no_init段的作用

noinit段指的是芯片SRAM的一块内存区域(注意是RAM区而非Flash),在该段定义的变量、或者函数,在除了掉电之外的任何芯片复位(如Reset复位、软件复位、看门狗复位)的情况下都不会被重新初始化,这个段可以用来保存一下用户信息。

2.no_init段实现方法

首先在keil mdk的Options->Target设置地址IARAM2地址为0x20010000,NoInit打勾后系统在启动时不会初始化这个区域的值。

在代码将NoInitVal的编译地址指定为NoInit区域。

uint8_t NoInitVal __attribute__((section(".bss.ARM.__at_0x20010000"))); //定义NoInitVal的编译地址

/*
//.s后跳转入口函数
*/
int main()
{
	//①clock
	SetSysClock();//设置系统时钟
	delay_init();//初始化delay延时函数
	NoInitVal++;//未初始化值累加
	//②uart
	UART0_Config(115200);//配置波特率115200
	UART0_Start();//启动串口
	UART0_PollSendBytes((uint8_t*)("hello world\r\n"), 13);//打印hell world测试UART
	sprintf(uart_sndBuf, "%04d\r\n", NoInitVal);
	UART0_PollSendBytes(uart_sndBuf, 6);//打印hell world测试UART
	delay_ms(2000);
	NVIC_SystemReset();
	//进入主循环
	while(1) 
	{
		
	}

3.测试效果

运行代码后,经过软件复位后 NoInitVal的值累加,“21,22,23…… 28,29”打印,未被初始化。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐