RT-Thread 기록 (2. RT-Thread 커널 시작 프로세스 - 시작 파일 및 소스 코드 분석)

在上一篇文章中,我们了解了RT-Thread的版本以及开发环境,使用RT-Thread Studio成功创建了一个工程。
但是要了解一个操作系统,内核的了解是必不可少的,
我们今天就在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程
.. 更新一个说明,SMP是对多核处理器的支持相关部分      		 2022/3/15

1. 기본 소개

커널 시작 프로세스의 공식 소개 링크는 다음과 같습니다.

RT-Thread 공식 커널 시작 프로세스 소개

내 STM32 열에는 STM32 시작에 대한 별도의 블로그 게시물이 있습니다.

STM32 시작 프로세스(startup_xxxx.s 파일 분석)

베어메탈 프로그램에서 일반적으로 .s 파일 _main로 점프하여 main()함수 시작으로 점프하는 반면 RT-Thread 시작은 먼저 시작 함수로 점프하여 일련의 필요한 초기화 rtthread_startup()를 수행 하고 마지막으로 main()함수로 점프합니다.

간단히 말해서 프로그램이 시작되면 rtthread_startup()startup_xxxx.s 파일(어셈블리 언어)을 통해 RT-Thread 시작 기능(C 언어)으로 rtthread_startup()점프 를 통해 main()(C 언어) 기능으로 점프합니다.

공식 사진은 이 프로세스를 매우 자세히 보여줍니다.

여기에 이미지 설명 삽입
RT-Thread에서 main()함수 는 스레드로 처리됩니다. rtthread_startup()이렇게 하면 main()스레드가 생성되고 추가 로 스레드와 유휴 스레드라는 두 개의 스레드 rtthread_startup()가 생성 됩니다.timer

위의 그림과 함께 이전 글에서 만든 샘플 코드를 통해 이 과정을 설명해보자.

2. 소스 코드 분석

2.1 조립 부품 - startup_xxxx.s 설명

startup_xxxx.s파일 을 찾을 수 있는 RT-Thread Studio 프로젝트를 엽니다 . 다음 그림을 참조하세요.
여기에 이미지 설명 삽입

열고 볼 수 있는 시작 파일을 찾았습니다. 시작 파일에 대한 설명은 다른 블로그 게시물에 자세히 설명되어 있습니다.

STM32 시작 프로세스 - startup_xxxx.s 파일 분석 (GCC 환경에서 시작 파일 분석 업데이트)

더 자세히 설명되어 있으므로 여기서는 주요 내용만 간략하게 설명하겠습니다. 위의 추천 블로그 포스트에서 언급했듯이 GCC 환경을 시작하기 위해서는 두 개의 파일이 필요합니다. 하나는 startup_xxxx.s파일 이고 다른 하나는 .ld링크 파일입니다. 먼저 링크 파일을 살펴보겠습니다.
여기에 이미지 설명 삽입

앞에서 언급했듯이 GCC 아래의 링크 파일은 주로 데이터 세그먼트의 진입 기능, 스택 크기 및 전체 레이아웃을 공식화합니다. 위의 이미지에서 값이 시스템 스택의 크기를 정의하고 힙의 크기를 정의하지 않는다는 것을 알 수 있습니다.

여기서 시스템 스택만 정의하는 이유는 무엇입니까?
다른 블로그 포스트에서 malloc함수 를 사용하지 않으면 힙을 사용할 필요가 없다고 했지만 여기서는 힙의 사용 여부에 따라 힙의 크기가 정의되기 때문에 정의가 없습니다. 나중에 초기화하는 동안이 아닙니다.
지침은 이 문서 아래의 패널 수준 하드웨어 초기화 섹션에 설명되어 있습니다.

그런 다음 간단히 startup_xxxx.s파일 . 먼저 전원이 켜졌을 때 실행될 첫 번째 명령을 찾습니다 Reset_Handler(칩의 전원이 켜져 있고 전원이 켜진 상태로 재설정되며 직접 트리거 Reset_Handler됨).

여기에 이미지 설명 삽입
위 그림의 작업을 이해하지 못하는 경우 블로그 게시물을 볼 수 있습니다.

STM32 관련 메모리 관리(메모리 아키텍처, 메모리 관리, 맵 파일 분석)

데이터 전송이 완료되면 아래 그림과 같이 시스템
여기에 이미지 설명 삽입
의 기본 초기화가 됩니다. 기본 초기화가 완료된 후 MCU가 실행될 수 있으며 위의 기본 소개에서 언급한 진입 기능으로 점프할 수 있습니다. 위
여기에 이미지 설명 삽입
의 단계를 거쳐 최종적으로 from s 의 어셈블리는 C 언어 부분으로 점프하고, entry 함수를 통해 해당 rtthread_startup함수 . 함수 rtthread_startup진입 후 RT-Thread가 하는 일을 다음을 통해 설명하겠습니다. 소개.

2.2 섹션 C - rtthread_startup 설명

이 기사의 첫 번째 섹션의 기본 소개에서 공식 그림은 rtthread_startup입력 후 수행되는 작업을 보여줍니다.또한 다음과 같이 프로젝트가 rtthread_startup함수 및 함수 rtthread_startup에 들어간 후 수행되는 작업에 대해 설명했습니다. 그림:
여기에 이미지 설명 삽입
보충 설명: 위 그림의 SMP는 멀티 코어 프로세서와 관련된 설정과 관련이 있습니다.

위의 과정은 이해하기 쉬우며 주요 업무는 다음과 같습니다.

1. 기본 하드웨어 초기화;

2. 메인 스레드가 생성됩니다.

3. 소프트웨어 타이머 사용 여부에 따라 타이머 스레드를 생성합니다.

4. 유휴 스레드가 생성됩니다.

5. 스케줄러를 초기화합니다.

특정 작업을 자세히 살펴볼 수 있는 몇 가지 초기화가 있습니다.

2.2.1 보드 하드웨어 초기화 - rt_hw_board_init

rt_hw_board_init하드웨어 관련 초기화는 다음과 같이 함수 를 사용 하여 수행됩니다.
여기에 이미지 설명 삽입

2.2.2 RT-Thread 힙 및 스택 공간 설명(FreeRTOS와 다름)

위의 그림에서 힙 공간의 초기화라는 특별한 것이 있는데, 앞서 우리가 접했던 것은 시작 파일에서 스택 공간을 정의하는 것이었습니다. 스택 공간. , 힙 공간은 정의되지 않고 실제로 다음 위치에 배치됩니다 .
여기에 이미지 설명 삽입

처음에는 여기에 여전히 질문이 있었습니다. HEAP는 나머지 RAM을 모두 사용합니다. 이전 이해에 따르면 시스템 스택은 마지막 위치에 있어야 합니다. 여기에서 무슨 일이 일어나고 있습니까?

시스템 스택의 위치와 관련하여 블로그 게시물인 RTOS 작업 스택 및 시스템 스택 을 참조할 수 있습니다.

위의 소스 코드를 통해 본 결론은 이 블로그 게시물에서 말한 것과 다르며(당시 베어메탈과 FreeRTOS가 예제로 사용되었습니다) RT-Thread 아래에서 시스템 스택의 위치는 어디입니까? 그래서 저는 데이터 세그먼트의 전체 레이아웃을 정의하는 링크 파일을 살펴보세요. 링크 파일을
여기에 이미지 설명 삽입
통해 .stack의 위치를 ​​유추할 수 있으므로 확인을 위해 프로그램이 컴파일된 후 .map 파일을 볼 수 있습니다.
여기에 이미지 설명 삽입

RAM 데이터 세그먼트에서 데이터가 저장된 위치를 보고 시스템 스택에 대한 위치 부분을 찾을 수 있습니다.

여기에 이미지 설명 삽입
RT-Thread에서는 실제로 시스템 스택의 위치가 .data 세그먼트와 .bss 사이에 저장되어 있으므로 힙 공간이 나머지 램 공간을 모두 사용해도 문제가 없음을 확인했다.

2.2.3 메인 쓰레드 생성 - rt_application_init

RT-Thread "main"에서는 아래와 같이 함수 main()에 있는 함수 rtthread_startup를 호출하기 위해 이름이 지정된 스레드가 생성됩니다.rt_application_init()
여기에 이미지 설명 삽입

2.2.4 스케줄러 설명

스케쥴러는 운영체제의 핵심 지식으로, 스케쥴러는 연결 리스트를 기반으로 동작하는데, 구체적인 원리는 추후 별도의 글에서 설명하도록 하겠다. 여기서는 간략히 살펴보고 그 기능의 목적을 알아보도록 하겠다.

rtthread_startup함수에서 초기화 스케줄러를 사용하고 스케줄러 rt_system_scheduler_init();rt_system_scheduler_start();켜면 스케줄러가 켜진 후 스레드가 특정 규칙(시간 조각, 우선 순위)에 따라 전환됩니다.

여기에 이미지 설명 삽입

스케줄러가 켜진 후 가장 높은 우선 순위를 가진 스레드가 준비 목록에서 찾은 다음 스레드 포인터(PSP)를 설정하여 실행할 해당 위치로 점프합니다.

스레드 포인터가 의미하는 바는 블로그 게시물을 참조할 수 있습니다. FreeRTOS 레코드(3. FreeRTOS 작업 스케줄링의 원리 분석 _Sysstick, PendSV, SVC)
여기에 이미지 설명 삽입

이 시점에서 전체 시스템은 정상적으로 실행되고 사용자는 자신이 하고 싶은 대로 실행하고 메인에서 자신의 애플리케이션 코드를 디자인하거나 스레드를 생성할 수 있습니다.

추천

출처blog.csdn.net/weixin_42328389/article/details/122989172