>  기사  >  시스템 튜토리얼  >  STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

王林
王林앞으로
2024-02-12 08:00:04868검색

Linux에는 배울 가치가 있는 프로그래밍 아이디어가 많이 있습니다. 많은 기술 전문가들은 이러한 아이디어와 메커니즘을 마이크로 컨트롤러 프로그래밍, 특히 STM32에서 Linux 커널의 자동 초기화 프로세스를 시뮬레이션하는 데 적용했습니다.

일반적으로 우리는 프로그램을 작성할 때 특정 루틴을 따릅니다. 순차적 논리에 따라 기능을 하나씩 실행해 보겠습니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

로직이 매우 복잡하고 많은 모듈이 포함된 경우 순차적으로 실행되는 코드가 비대해지고 모듈이 매우 긴밀하게 결합됩니다. Linux 커널에는 다양한 주변 장치 드라이버가 있으며 이를 논리적으로 순차적으로 실행하는 것은 거의 불가능합니다.

그리고 켄렐 코드는 이렇게 많은 양의 코드를 가질 수 있고, 크지만 지저분하지 않으며, 각 레벨과 모듈을 효과적으로 분리하고, 많은 양의 코드를 논리적으로 함께 구성하는데, 이 initcall이 중요한 역할을 합니다.

이 방법을 모방하여 마침내 그림의 주요 기능 코드를 지우고 이 논리를 분리하여 동일한 기능을 달성합니다.

이러한 기능을 구현하려면 몇 가지 배경 지식이 필요합니다.

1. 프로그램 코드 구성

2. 링크 스크립트 관련 지식.

3. 함수 포인터 적용.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

그림과 같은 코드 구성에서는 변수 a, b 및 함수 포인터 f, f2가 프로그램의 어느 섹션에 저장되어 있는지 알아야 합니다. 이 stm32 시작 코드 구현을 읽을 수 있습니다. f는 bss 세그먼트에 저장되고, b, f2는 초기값이 지정되었기 때문에 데이터 세그먼트에 저장되며, 이 intcall을 구현하면 자동으로 초기화해야 하는 데이터가 .initcall과 같은 사용자 정의 세그먼트에 저장됩니다.

특정 섹션에 넣는 방법은 attribute((섹션)) 키워드를 사용하여 데이터 저장 섹션을 변경해야 합니다.

현재 프로그램은 이 세그먼트를 사용하여 컴파일됩니다. 또한 추가된 .isr_Vector를 제외하고 나머지는 컴파일러의 기본 세그먼트입니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

먼저 코드를 추가하세요:

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

물론 이것만으로는 충분하지 않습니다. 링커(LD)에게 .initcall 섹션을 프로그램에 연결하도록 지시해야 하므로 이 섹션도 수정해야 합니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

이 섹션은 8바이트로 정렬되어 있으며 두 개의 전역 변수를 정의하고 이러한 데이터를 0-5 순서로 연결합니다. 이 두 가지 수정 사항을 통해 프로그램의 각 섹션을 살펴보겠습니다.

사진:

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

.initcalls 섹션에는 추가 빨간색 상자가 있습니다. 이 섹션은 0x80005a8부터 시작하여 총 8바이트입니다.

readelf 도구를 사용하여 이 단락의 구체적인 상황을 살펴보겠습니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

위의 크기 도구와 일치하며, 녹색 상자의 주소는 SystemInit(0x08000231, little endian 모드)입니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

그래서 속성과 링크 스크립트 수정을 통해 함수 포인터 변수가 .initcall 섹션에 배치됩니다.

그렇다면 이 함수를 호출하는 방법은 이전의 초기화 데이터 세그먼트 데이터와 유사합니다. 이 세그먼트를 순회한 후 함수 주소를 꺼내고 세그먼트의 주소를 강제로 함수 포인터로 변환한 다음 직접 호출합니다. .

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

구현한 그림은 .initcall 섹션에서 함수 주소를 가져와서 직접 호출하는 것입니다. 함수의 주소와 함수 포인터 변수의 주소를 혼동하기가 매우 쉽습니다.

이렇게 코드를 수정하면 자동 초기화 기능은 실제로 조정이 가능하지만 매번 이렇게 긴 static initcall_t __attribute__(( __ Used__,__ section__(“.initcall.0.init”) 의 긴 섹션을 ​​작성해야 합니다. )), 이는 Linux 커널의 매크로를 통해 수정되었습니다.

이것도 마찬가지입니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

프로그램의 논리적 순서에 따라 실행되는 매크로를 추가하세요

0, low_level_init 예를 들어 시스템 기본 시계를 초기화합니다

1, arch_init 예를 들어 NVIC의 일부 초기화 등 CPU 아키텍처를 넣습니다.

2.dev_init는 i2c, 플래시, spi 등과 같은 주변 모듈을 초기화합니다.

3.board_init는 특정 하드웨어 보드에 대한 일부 설정을 지정합니다.

4. os_init 파일 시스템, 네트워크 프로토콜 스택 등과 같은 운영 체제의 일부 설정입니다.

5, app_init가 드디어 사용자 프로그램을 실행합니다.

자신의 프로그램을 수정하고 대신 매크로를 사용하세요. 이렇게 하면 do_initcalls에 대한 호출이 0, 1~5의 순서로 실행됩니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

마지막으로 initcall 섹션을 살펴보겠습니다.

STM32에서 Linux 자동 초기화 프로세스 시뮬레이션STM32에서 Linux 자동 초기화 프로세스 시뮬레이션STM32에서 Linux 자동 초기화 프로세스 시뮬레이션STM32에서 Linux 자동 초기화 프로세스 시뮬레이션

이런 식으로 자동 초기화 함수에 dev_init(), app_init() 같은 것을 추가하기만 하면 메인 함수에서 하나씩 실행할 필요 없이 자동으로 호출됩니다.

예를 들어 i2c 제어의 초기화는 아래에 많은 i2c 슬레이브 장치가 걸려 있습니다. 새로운 슬레이브 장치가 나오더라도 그냥 초기화할 필요가 없습니다. 원래의 것을 변경하려면 분리된 모듈 간의 높은 수준의 결합이 필요합니다.

이것은 Linux Kenerl 초기화를 시뮬레이션하고 검증이 성공하여 최종적으로 라이브러리에 업로드됩니다.

위 내용은 STM32에서 Linux 자동 초기화 프로세스 시뮬레이션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제