2016-08-19 2 views
1

Keil RTX RTOS 구성 파일에서 사용자는 기본 사용자 스레드 스택 크기를 구성 할 수 있습니다. 일반적으로 스택에는 자동/로컬 변수가 있습니다. "ZI 데이터"섹션에는 초기화되지 않은 전역 변수가 있습니다.Keil RTX RTOS 스레드 스택 크기

RTX 구성 파일에서 사용자 스레드 스택 크기를 변경하면 스택 크기가 증가하고 "ZI 데이터"섹션 크기가 증가하지 않습니다.

나는 그것을 테스트하고, 테스트 결과는 내가 사용자 스레드 스택 크기를 증가 시킨다는 것을 보여준다. "ZI 데이터"섹션 크기가 동일한 크기와 동 기적으로 증가합니다.

내 테스트 프로그램에는 6 개의 스레드가 있고 각각 600 바이트 스택이 있습니다. Keil을 사용하여 프로그램을 빌드하면 다음과 같이 표시됩니다.

 
     Code (inc. data) RO Data RW Data ZI Data  Debug 

    36810  4052  1226  380  6484  518461 Grand Totals 
    36810  4052  1226  132  6484  518461 ELF Image Totals (compressed) 
    36810  4052  1226  132   0   0 ROM Totals 

============================================================================== 

    Total RO Size (Code + RO Data)    38036 ( 37.14kB) 
    Total RW Size (RW Data + ZI Data)    6864 ( 6.70kB) 
    Total ROM Size (Code + RO Data + RW Data)  38168 ( 37.27kB) 

그러나 각 스레드 스택 크기를 800 바이트로 변경 한 경우 Keil은 다음과 같이 나를 보여줍니다 :

 
============================================================================== 


     Code (inc. data) RO Data RW Data ZI Data  Debug 

    36810  4052  1226  380  7684  518461 Grand Totals 
    36810  4052  1226  132  7684  518461 ELF Image Totals (compressed) 
    36810  4052  1226  132   0   0 ROM Totals 

============================================================================== 

    Total RO Size (Code + RO Data)    38036 ( 37.14kB) 
    Total RW Size (RW Data + ZI Data)    8064 ( 7.88kB) 
    Total ROM Size (Code + RO Data + RW Data)  38168 ( 37.27kB) 

============================================================================== 

"ZI 데이터"섹션 크기가 6484에서 7684 바이트로 증가합니다. 7684 - 6484 = 1200 = 6 * 200. 그리고 800 - 600 = 200. 그럼 스레드 스택이 "ZI 데이터"섹션에 놓여있는 것을 볼 수 있습니다.

내 질문은 : 는 스레드 스택에 넣을 때 "ZI 데이터"섹션을 RAM에 자동/스레드 로컬 변수는, "ZI 데이터"섹션에 배치됩니다 의미합니까? 사실이라면 스택 섹션이 전혀 없다는 의미입니다. "RO/RW/ZI 데이터"및 힙 섹션 만 있습니다.

이 기사는 다른 대답을 제공합니다. 그리고 나는 지금 그것에 대해 약간 혼란 스럽습니다. https://developer.mbed.org/handbook/RTOS-Memory-Model

+0

_ "스택은 자동/로컬 변수를 보유하고 있습니다"_ - 실행중인 스레드의 관점에서 볼 때 "스택"입니다. 하지만 그 스택이 OS의 관점에서 볼 때 정적으로 할당 된 변수가 될 수는 없습니다. 당신은 단지 여기에 관찰을 제시했습니다. 특정 질문은 무엇입니까? – Notlikethat

답변

1

링커는 존재하는 메모리 섹션을 결정합니다. 링커는 기본적으로 일부 메모리 섹션을 만듭니다. 귀하의 경우 세 가지 기본 섹션은 분명히 "RO 데이터", "RW 데이터"및 "ZI 데이터"로 명명됩니다. 변수가 어디에 위치해야하는지 명시 적으로 지정하지 않으면 링커는 변수가 const, 초기화 또는 초기화되지 않았는지 여부에 따라이 기본 섹션 중 하나에 할당합니다.

링커는 RTOS를 사용하고 있음을 자동으로 인식하지 않습니다. 또한 스레드 스택으로 사용할 변수에 대한 특별한 지식도 없습니다. 따라서 링커는 스레드 스택에 대한 독립적 인 메모리 섹션을 자동으로 만들지 않습니다. 오히려 링커는 스택 변수를 다른 변수와 마찬가지로 처리하여 기본 메모리 섹션 중 하나에 포함시킵니다. 귀하의 경우에는 스레드 스택이 링커에 의해 ZI 데이터 섹션에 놓여있는 것 같습니다.

링커에서 스레드 스택을위한 특수 독립 메모리 섹션을 만들려면 링커 명령 파일을 통해 링커에게 명시 적으로 지시해야합니다. 그리고 스택 변수가 사용자 정의 섹션에 있어야한다고 지정해야합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 링커 설명서를 참조하십시오.

+0

감사합니다. 일반적으로 "RO 데이터", "RW 데이터"및 "ZI 데이터", "스택", "힙"과 같은 일부 기본 섹션이 있습니다. 링커는 플래시 메모리 및 램 메모리 레이아웃을 결정합니다. 스레드 스택이 "ZI Data"에 배치되면 스레드에서 호출 된 함수의 모든 자동 변수가 "ZI Data"섹션에 있음을 의미합니까? 그러면 "스택"섹션에 무엇이 있습니까? –

+0

메인 프로그램을위한 스택이 있습니다. 이것은 main()이 호출 될 때, 그리고 RTOS가 시작되기 전에 사용되는 스택이다. 링커 명령 파일에서 주 스택에 대한 메모리 섹션을 명시 적으로 지정할 수 있습니다. 각 쓰레드는 메인 스택과는 별도의 스택을 가지고 있습니다. 링커가 ZI 데이터 섹션에서 이러한 스레드 스택을 찾습니다. RTOS가 실행되면 스레드 로컬 변수가 스레드 스택에 작성됩니다. 예. 스레드 스택이 ZI Data에 있으므로 스레드 로컬 변수가 ZI Data에 있습니다. 메인 스택은 RTOS가 실행되기 전에 로컬 변수가있는 곳입니다. – kkrambo

+0

RTOS가 실행 된 후 "주 기능"이 절대로 다시 호출되지 않습니다. 그래서 메인 스택은 RTOS가 망가지면 결코 사용되지 않을 것입니다. 메모리를 절약하기 위해서는 메인 스택과 스레드 스택 메모리 공간이 겹칠 수 있다는 의미입니다. –

0

작업 스택은 RTX에서 기본적으로 정적으로 할당되며 고정 크기입니다.

os_tsk_create_user()은 호출자가 어떤 방식 으로든 (정적으로 또는 힙에서 할당 할 수있는 스택을 제공 할 수 있지만 호출자 스택에서 할당은 가능하지만 일반적이지는 않지만 무의미하고 위험 할 수 있음) 8 바이트 정렬. 나는 RTX의 자동 스택 할당이 거의 쓸모가없고 드물지만 모든 경우에 적절하다고 생각한다.