STM32 RAM / ROM 배포 - 시작 - 업그레이드

RAM / ROM- 시작의 STM32 - 업그레이드

먼저, 기사가 설명
STM32 (다른 모든 마이크로 컨트롤러 등 ARM을 포함)을, 우리는 (startup_xxx.s을, 코드를 실행하는 자기 기록 (XC, XH), 도서관 (x.lib \ XA), 시작 파일 등의 일부를 볼 수 있습니다 )와에 이렇게. 이 (하나는 MAP 파일에서 볼 수 있듯이) 다른 IDE 환경을 자신의 부트 코드입니다
그림 I
컴파일 위의 코드의 모든 일을하고 후 이진 실행 형태 (라는 링크를 처리하는 단계, x.bin). 칩에 따라 ROM 주소를 프로그래밍하기위한 빈 파일을 실행할 수 있습니다.

둘, ROM 메모리 구조
STM32 용는 ROM에 기억 된 BIN 파일 구조, 데이터 구역을 포함한 여러 부분, BSS 세그먼트 힙 세그먼트, 스택 부, 코드 섹션, 인터럽트 벡터 테이블 섹션 입구 리 스타트 (포함한다 기본 스택 포인터 초기 값) 등을들 수있다.
우리는 처음부터 과정을 살펴 봅니다.
우선, 이것은 "리셋 부팅 항목"입니다. 이 항목은 두 사람의 정체성 -PC와 SP를 지정합니다. 이 입구 도로 옆에 있었다가는 것입니다. 도 II는 입구 리 스타트 코드이다.
그림 II
STM32 엔디안 저장 모드 이후 "C3 00 20 08"기본 스택 포인터 SP = 0x2000C308을 나타내는 것이며, "A1 41 00 08"은 프로그램 포인터 = 0x080041a1 PC 나타내는 것이다. 맵의 도면에서 알 수있는 바와 같이, 유입구 startup_xxx.s 0x080041a1이다. 그림 III 실제로 참 startup_xxx.s 파일 () 함수를 SystemInit, 에뮬레이션 창 코드에 의해 캡처됩니다.
그림 III
왜 PC =?, SP 후 =? SystemInit (), 그들이 여기에 무슨 짓을했는지?

其次,便是中断向量表。中断向量表,即相应中断产生时,程序指针跳转到此处向量表,由向量表再跳转至相应的中断处理。表面上看,它没啥特殊,但是如果你的程序起始地址存在偏移时(与0x08000000)比如增加Bootloader时,那这向量表的意义就很大很大了。你可以想象一个问题,你的Bootloader(简称bl)有中断吧,你的主程序(简称app)有中断吧,那如何让你的Bl和app跑自己的中断呢?
这个时候,在bl和app做跳转时,有个特别重要的对接会议要开一下,商讨一下app的这个表在哪里,这个东西叫SCB。程序初始化时预设,运行时也可重设。
그림 IV

再次,就是code段了。这个就不用多说了,就是你的app代码。
再再次,就是data段,存放已初始化的全局变量、静态变量(不管初始化还是未初始化)。此处嘛,容易与RAM的data段混在一起。我提个问题,大概就能明白了,你有一个初始化的全局变量A=10,而运行时,A是在RAM里边的,同时RAM又是掉电不保存的,那么这个A=10是如何保证的呢?
原因就在这里,“复位启动入口”的SystemInit()完事之后,有个加载过程叫“加载数据段”(_scatterload_copy),之后才转到_main处运行。这个加载过程,便是将这段ROM的data段数据,拷贝到对应的RAM,从而保证上电后A=10之类的承诺。
这个地方,既重要,也不重要。做升级时,如果你的下载,掉了这一段,不会影响你的代码运行,只是会影响到与这些全局变量和静态变量的判断。

最后,就是bss段了,是存放未初始化的全局变量。这个在我看来,没啥特殊。若有特殊,后面遇到再补上。

三、 RAM分配
直接上图

그림 V
从内存上看,已经很明了了,先是data段,再是bss段,然后是heap(堆),最后是stack(栈)。
Data段,就是已初始化的全局变量和静态变量(未初始化、初始化),需要从code段加载。Bss就是未初始化的全局变量。这两个都属于静态内存分配,是程序编译时已经决定大小的。
Heap段,就是传说中的堆,大小是固定,但是怎么用,用多少,就是我们决定的了,因为它就是malloc和free的那块内存。
Stack段,就是很熟悉的那个栈,很像个客栈对吧。对,它就是个客栈,包含了同样的属性-临时。这一块内存,是函数跳转、局部变量等用到的。函数跳转时,是怎么回来的呢?回来之后,是怎么保证原来的变量值能继续运行呢?局部变量为什么出了作用域就用不了了呢?所有的这些,都是栈的作用。

说到这里,罗嗦几句。Heap分配太小,那你会经常malloc不到内存。Stack分配太小,那你会经常程序跑飞。

四、 启动
到这里,相信大家已经明白了,把上面的流程组合起来,就是完整的启动流程。
1、上电复位,设置PC,SP
2、跳转到SystemInit(),其中初始化了时钟、SCB(即中断向量表)
3、跳转到_scatterload_copy,完成data\bss段的加载工作
4、跳转到main

V. 업그레이드
업그레이드 과정에서 발생하는 문제 :
1, 카일은 항상 정지 곳, 최대 속도 및 단일 단계 작업을 실행할 수 없습니다, 그러나 컴파일 창에서,하지만 당신은 하나의 단계 작업을 할 수 있습니다.
가능한 원인 : 너무 많은 브레이크 포인트는 모든 중단 점을 제거한 후 다시 시도, 카일 장소를 사용했다.
2, BL 응답 인터럽트 APP 정상 반응을 방해 아니지만. 특히, 일부 지역은 HAL_GetTick ()를 사용합니다
이유 : BL은 APP 인터럽트에 점프 후하지 작업을 일으키는) (disable_irq에서 사용하기 때문에 (호출되지 않은 경우 enable_irq ()).
3, APP 수시로 재설정.
이유 : BL으로 인해이 IWDG을 열고, 당신은 IWDG 후 다시 해제 할 수 없기 때문에, IWDG은 프로그램 리셋 후 만료됩니다.
에 업그레이드 과정에서 나중에 보충.

게시 20 개 원래 기사 · 원 찬양 16 ·은 40000 +를 볼

추천

출처blog.csdn.net/tianjueyiyi/article/details/90600051