Was ist der Zweck der __weak-Referenz, die auf Keil MDK ARM verwendet wird?

Wurde ein wenig chaotisch mit einer Funktion, die in zwei Dateien und einer mit einem __weak-Symbol definiert ist. Ich habe die folgende Funktion aufgerufen, um die Einstellungen von UART1 in STM32L476RG aus meiner Hauptdatei zu laden

 if(HAL_UART_Init(&UartHandle) != HAL_OK) and this function is defined at 
  {
    Error_Handler();
  }

Ich habe festgestellt, dass diese Funktion eine andere Funktion namens HAL_UART_MspInit(huart);This aufruft, die an zwei Stellen definiert ist.

 1. in stm32l4xx_hal_msp.c as void HAL_UART_MspInit(UART_HandleTypeDef
    *huart)
 2. in stm32l4xx_hal_uart.c as __weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)

Mein Problem ist, dass jedes Mal, wenn ich die UART-Einstellung lade, die __weak-Funktion aufgerufen wird. Ich habe es getan, indem ich auf ein Beispiel verwiesen habe, UART_WakeUpFromStop, das auf der [STM32F476RG-Produktseite] angegeben ist . wobei im Beispiel die Funktion in nstm32l4xx_hal_msp.c , void HAL_UART_MspInit(UART_HandleTypeDef *huart) aufgerufen wird. Was läuft in meinem Code falsch? Was ist der Einfluss von __weak Symbol?

STM32L476RG Referenzhandbuch

__schwache Funktionen sind normalerweise Platzhalter oder Standardwerte und Sie können sie mit einer anderen Funktion überschreiben, indem Sie sie einfach mit demselben Namen deklarieren. Sind Sie sicher, dass Ihre "echte" nicht schwache Funktion wirklich kompiliert und eingebunden wird?

Antworten (1)

Damit die Definition und Implementierung mit einem nicht schwachen Typ, auch bekannt als benutzerdefinierter Typ, überschrieben werden kann.

Überprüfen Sie das Handbuch zum Bienenanzug.

aber warum wird es in meinem Code zu einem schwachen Typ?