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

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐