인프런 커뮤니티 질문&답변

Embedded June님의 프로필 이미지
Embedded June

작성한 질문수

FreeRTOS 프로그래밍

F103RB보다 저성능 보드를 사용하면 안되나요?

작성

·

389

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
더운 여름에도 좋은 강의제공해주셔서 항상 감사합니다 선생님.
집에 F103RB이 없고 L053R8이 있어 이 보드로 RTOS 실습을 진행하고자 합니다.
첫 예제인 '01.TASKMAN'을 디버깅 하던 도중
Error! Failed to read target status
Debugger connection lost.
Shutting down...

이라는 오류를 만나고 정상적으로 디버깅이 되지 않는 문제를 만났습니다.

해당 오류에 대해 구글링을 해봤지만, 마땅한 해결책이 나오지 않아 실습에 어려움을 겪고 있습니다.

ST-LINK를 지웠다가 다시 설치해도 동일한 문제가 반복됩니다.

CubeIDE의 'Build Analyzer'를 보니 빌드된 프로그램이 RAM을 18.35KB, flash는 17.3KB를 사용하는 것 같습니다.

F103RB는 20KB SRAM과 128KB flash를 가지고 있고, L053R8은 8KB SRAM과 64KB flash를 가지고 있는데, 메모리 부족 때문에 디버깅 문제가 생기는 것일까요? Debug console 전문을 올립니다! 감사합니다!

STMicroelectronics ST-LINK GDB server. Version 5.9.1
Copyright (c) 2021, STMicroelectronics. All rights reserved.

Starting server with the following options:
        Persistent Mode            : Disabled
        Logging Level              : 31
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Enabled
        SWD Debug                  : Enabled
        InitWhile                  : Enabled

COM frequency = 4000 kHz
Target connection mode: Under reset
Reading ROM table for AP 0 @0xf0000fd0
Hardware watchpoint supported by the target 
ST-LINK Firmware version : V2J38M27
Device ID: 0x417
PC: 0x8002ae8
ST-LINK device status: HALT_MODE
ST-LINK detects target voltage = 3.26 V
ST-LINK device status: HALT_MODE
ST-LINK device initialization OK
Waiting for debugger connection...
Waiting for connection on port 61234...
Waiting for connection on port 61235...
Accepted connection on port 61234...
Debugger connected
 ------ Switching to STM32CubeProgrammer ----- 
      -------------------------------------------------------------------
                       STM32CubeProgrammer v2.8.0                  
      -------------------------------------------------------------------

ST-LINK SN  : 066DFF565653756687162247
ST-LINK FW  : V2J38M27
Board       : NUCLEO-L053R8
Voltage     : 3.25V
SWD freq    : 4000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x417
Revision ID : Rev X
Device name : STM32L05x/L06x/L010
Flash size  : 64 KBytes
Device type : MCU
Device CPU  : Cortex-M0+
BL Version  : 0x__



Memory Programming ...
Opening and parsing file: ST-LINK_GDB_server_a05200.srec
  File          : ST-LINK_GDB_server_a05200.srec
  Size          : 17720 Bytes
  Address       : 0x08000000 


Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 138]
Download in Progress:
�������������������������������������������������� 0%
������������� 26%������������� 52%������������� 78%����������� 100%

File download complete
Time elapsed during download operation: 00:00:01.752



Verifying ...


Read progress:
�������������������������������������������������� 50%
����� 11%������ 23%������ 34%������ 46%����� 57%������ 69%������ 80%������ 92%���� 100%

Download verified successfully 


 ------ Switching context ----- 
COM frequency = 4000 kHz
Target connection mode: Under reset
Reading ROM table for AP 0 @0xf0000fd0
Hardware watchpoint supported by the target 
ST-LINK Firmware version : V2J38M27
Device ID: 0x417
PC: 0x8002ae8
ST-LINK detects target voltage = 3.26 V
ST-LINK device status: HALT_MODE
ST-LINK device initialization OK
SWV poll delay set to 3413µs for baudrate 0Hz
Accepted connection on port 61235...
handle_vCont_c, continue thread
ST-LINK device status: LOCKUP
Enter STM32_SystemReset() function 
NVIC_DFSR_REG = 0x0000000B
NVIC_CFGFSR_REG = 0x00000000
Error! Failed to read target status 
Debugger connection lost.
Shutting down...

Stopping port 61235

답변 1

1

홍영기님의 프로필 이미지
홍영기
지식공유자

Embedded June님!!! 우선 FreeRTOS 프로그래밍 강좌에 관심을 가져주셔서 감사드립니다.

말씀하신 것처럼 F103RB 과 L053R8 은 서로 다른 STM32 보드입니다.

따라서, 해당 보드에서 FreeRTOS 을 사용하시려면 포팅 작업을 먼저 진행해주셔야합니다.

자세한 포팅 가이드는 제 영상 중 PART3. FreeRTOS 포팅 실습 영상을 참고해주시면 되요.

PART3. FreeRTOS 포팅 실습 영상(약 12개)을 모두 보시고, 직접 포팅을 해보시는 것을 추천드립니다.

포팅이 잘 안되거나, 직접 하시기 부담스러우시면 메일(guileschool@gmail.com) 주세요.

Zoom 이나 Webex 같은 화상 채팅 앱을 이용해서 원격으로 도와드릴 수 있습니다.

제가 가능한 날짜는 8월6일부터이고요, 시간대는 월,수,금 오후 8시~11시 사이입니다.

원격미팅을 원하시는 희망 날짜와 시간을 1순위, 2순위, 3순위까지 알려주시면 회신드릴게요.

Embedded June님의 프로필 이미지
Embedded June
질문자

정말 빠르게 답변주셔서 정말정말 감사합니다!

우선 친절하게 설명해주신 영상대로 포팅 완료했고, 기존의 문제는 해결했습니다.

기존 프로젝트를 import할 때 MCU도 일치해야 문제가 안생긴다는 점을 배웠습니다. 정말 감사합니다.

printf()와 관련된 많은 오류를 새롭게 발견했습니다. 결과적으로 두 MCU의 UART와 HAL에 대한 코드가 달라서 발생하는 문제인 것 같습니다. 

`printf()`를 하기 위해 `__io_putchar()`를 main.c에 넣으니 

unknown type name 'UART_HandleTypeDef'; did you mean 'I2C_HandleTypeDef'?
undefined reference to `HAL_UART_Transmit'

console에 위와 같은 에러가 발생했습니다. 

'01_TASKMAN/Src/main.c'을 그대로 저의 'main.c'에 복사한 뒤 디버깅을 하면, 

make -j8 all 
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m0plus -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32L053xx -c -I../Core/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32L0xx/Include -I../Drivers/CMSIS/Include -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o"
../Core/Src/main.c:48:1: error: unknown type name 'UART_HandleTypeDef'; did you mean 'I2C_HandleTypeDef'?
   48 | UART_HandleTypeDef huart2;
      | ^~~~~~~~~~~~~~~~~~
      | I2C_HandleTypeDef
../Core/Src/main.c: In function '__io_putchar':
../Core/Src/main.c:73:3: warning: implicit declaration of function 'HAL_UART_Transmit' [-Wimplicit-function-declaration]
   73 |   HAL_UART_Transmit(&huart2, (uint8_t*)&"\r", 1, HAL_MAX_DELAY);
      |   ^~~~~~~~~~~~~~~~~
../Core/Src/main.c: In function 'SystemClock_Config':
../Core/Src/main.c:176:37: error: 'RCC_PLLSOURCE_HSI_DIV2' undeclared (first use in this function); did you mean 'RCC_PLLSOURCE_HSI'?
  176 |   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
      |                                     ^~~~~~~~~~~~~~~~~~~~~~
      |                                     RCC_PLLSOURCE_HSI
../Core/Src/main.c:176:37: note: each undeclared identifier is reported only once for each function it appears in
../Core/Src/main.c:191:47: error: 'FLASH_LATENCY_2' undeclared (first use in this function); did you mean 'FLASH_LATENCY_0'?
  191 |   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      |                                               ^~~~~~~~~~~~~~~
      |                                               FLASH_LATENCY_0
../Core/Src/main.c: In function 'MX_USART2_UART_Init':
../Core/Src/main.c:212:9: error: request for member 'Instance' in something not a structure or union
  212 |   huart2.Instance = USART2;
      |         ^
../Core/Src/main.c:213:9: error: request for member 'Init' in something not a structure or union
  213 |   huart2.Init.BaudRate = 115200;
      |         ^
../Core/Src/main.c:214:9: error: request for member 'Init' in something not a structure or union
  214 |   huart2.Init.WordLength = UART_WORDLENGTH_8B;
      |         ^
../Core/Src/main.c:214:28: error: 'UART_WORDLENGTH_8B' undeclared (first use in this function)
  214 |   huart2.Init.WordLength = UART_WORDLENGTH_8B;
      |                            ^~~~~~~~~~~~~~~~~~
../Core/Src/main.c:215:9: error: request for member 'Init' in something not a structure or union
  215 |   huart2.Init.StopBits = UART_STOPBITS_1;
      |         ^
../Core/Src/main.c:215:26: error: 'UART_STOPBITS_1' undeclared (first use in this function)
  215 |   huart2.Init.StopBits = UART_STOPBITS_1;
      |                          ^~~~~~~~~~~~~~~
../Core/Src/main.c:216:9: error: request for member 'Init' in something not a structure or union
  216 |   huart2.Init.Parity = UART_PARITY_NONE;
      |         ^
../Core/Src/main.c:216:24: error: 'UART_PARITY_NONE' undeclared (first use in this function)
  216 |   huart2.Init.Parity = UART_PARITY_NONE;
      |                        ^~~~~~~~~~~~~~~~
../Core/Src/main.c:217:9: error: request for member 'Init' in something not a structure or union
  217 |   huart2.Init.Mode = UART_MODE_TX_RX;
      |         ^
../Core/Src/main.c:217:22: error: 'UART_MODE_TX_RX' undeclared (first use in this function)
  217 |   huart2.Init.Mode = UART_MODE_TX_RX;
      |                      ^~~~~~~~~~~~~~~
../Core/Src/main.c:218:9: error: request for member 'Init' in something not a structure or union
  218 |   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      |         ^
../Core/Src/main.c:218:27: error: 'UART_HWCONTROL_NONE' undeclared (first use in this function)
  218 |   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      |                           ^~~~~~~~~~~~~~~~~~~
../Core/Src/main.c:219:9: error: request for member 'Init' in something not a structure or union
  219 |   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
      |         ^
../Core/Src/main.c:219:30: error: 'UART_OVERSAMPLING_16' undeclared (first use in this function)
  219 |   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
      |                              ^~~~~~~~~~~~~~~~~~~~
../Core/Src/main.c:220:7: warning: implicit declaration of function 'HAL_UART_Init'; did you mean 'HAL_I2C_Init'? [-Wimplicit-function-declaration]
  220 |   if (HAL_UART_Init(&huart2) != HAL_OK)
      |       ^~~~~~~~~~~~~
      |       HAL_I2C_Init
../Core/Src/main.c: In function 'MX_GPIO_Init':
../Core/Src/main.c:246:21: error: 'LD2_GPIO_Port' undeclared (first use in this function)
  246 |   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
      |                     ^~~~~~~~~~~~~
../Core/Src/main.c:246:36: error: 'LD2_Pin' undeclared (first use in this function)
  246 |   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
      |                                    ^~~~~~~
../Core/Src/main.c:249:25: error: 'B1_Pin' undeclared (first use in this function)
  249 |   GPIO_InitStruct.Pin = B1_Pin;
      |                         ^~~~~~
../Core/Src/main.c:252:17: error: 'B1_GPIO_Port' undeclared (first use in this function)
  252 |   HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
      |                 ^~~~~~~~~~~~
../Core/Src/main.c:262:24: error: 'EXTI15_10_IRQn' undeclared (first use in this function); did you mean 'EXTI4_15_IRQn'?
  262 |   HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
      |                        ^~~~~~~~~~~~~~
      |                        EXTI4_15_IRQn
../Core/Src/main.c: In function 'OSVersion':
../Core/Src/main.c:271:9: error: 'VERSION_RTOS' undeclared (first use in this function)
  271 |  return VERSION_RTOS;
      |         ^~~~~~~~~~~~
../Core/Src/main.c:272:1: warning: control reaches end of non-void function [-Wreturn-type]
  272 | }
      | ^
make: *** [Core/Src/subdir.mk:40: Core/Src/main.o] Error 1
"make -j8 all" terminated with exit code 2. Build might be incomplete.

22:18:09 Build Failed. 24 errors, 3 warnings. (took 983ms)

위와 같이 UART와 HAL과 관련된 무수한 오류가 뜨는 것을 확인할 수 있습니다.

선생님의 예제파일인 '01_TASKMAN/Src/main.c'와 자동생성된 저의 'main.c'의 내용물이 많이 다르고, MCU를 다른 걸 사용하다보니 '01_TASKMAN/Src/stm32f1xx~~.c'와 저의 'stm32l0xx~~.c'의 내용이 달라서 발생하는 문제인 것 같습니다.

빠르게 해결할 수 있는 문제가 아닌 것 같아 우선 F103RB 보드를 구매해서 강의를 수강하겠습니다

만일 보드를 바꿔도 문제가 생긴다면 이쪽과 메일로 추가문의 드리겠습니다! 감사합니다!

Embedded June님의 프로필 이미지
Embedded June

작성한 질문수

질문하기