Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是弱函数?它们的用途是什么?我使用的是stm32f429微控制器_C_Stm32f4discovery_Stm32f4_Stm32ldiscovery - Fatal编程技术网

C 什么是弱函数?它们的用途是什么?我使用的是stm32f429微控制器

C 什么是弱函数?它们的用途是什么?我使用的是stm32f429微控制器,c,stm32f4discovery,stm32f4,stm32ldiscovery,C,Stm32f4discovery,Stm32f4,Stm32ldiscovery,维基百科说: 弱符号表示链接过程中的特殊注释符号 可执行和可链接格式(ELF)对象文件。默认情况下,没有 任何注释,对象文件中的符号都是强的。在连接过程中,, 强符号可以替代同名的弱符号。在里面 相反,共享名称的两个强符号会产生链接错误 在连接时间内。链接二进制可执行文件时,弱声明 符号不需要定义。相比之下,(默认情况下)a 未定义的声明强符号触发未定义的 符号链接错误。C或C++语言中没有提及弱符号 标准;因此,将它们插入到代码中不是很容易移植的。 即使两个平台支持相同或相似的标记语法 由于符

维基百科说:

弱符号表示链接过程中的特殊注释符号 可执行和可链接格式(ELF)对象文件。默认情况下,没有 任何注释,对象文件中的符号都是强的。在连接过程中,, 强符号可以替代同名的弱符号。在里面 相反,共享名称的两个强符号会产生链接错误 在连接时间内。链接二进制可执行文件时,弱声明 符号不需要定义。相比之下,(默认情况下)a 未定义的声明强符号触发未定义的 符号链接错误。C或C++语言中没有提及弱符号 标准;因此,将它们插入到代码中不是很容易移植的。 即使两个平台支持相同或相似的标记语法 由于符号很弱,语义可能在细微之处有所不同,例如。 运行时动态链接期间的弱符号是否丢失 语义与否

弱函数是什么?它们的用途是什么?我使用的是stm32f429微控制器。图书馆有一些薄弱的功能。但我不明白,它们是什么和它们的用途


我在谷歌上搜索了一下,但没有得到满意的答案

当函数前面有描述符_弱时,它基本上意味着如果您(编码者)没有定义它,它就在这里定义

让我们看看我的死敌“HAL_UART_RxCpltCallback()”

此函数存在于STM32F4-HAL代码库的HAL中,可从ST Micro下载

在文件stm32f4xx_hal_uart.c中,您会发现此函数定义为:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* NOTE: This function Should not be modified, when the callback is needed,
       the HAL_UART_RxCpltCallback could be implemented in the user  file
  */
}
因此,正如代码中的注释所述,将此函数放在您自己的用户文件中。但是,在执行此操作时,不要输入弱术语。这意味着链接器将接受您对HAL_UART_RxCpltCallback()函数的定义,而不是stm32f4xx_HAL_UART.c文件中定义的函数

这使泛型代码库能够始终编译。您不必编写一大堆您不感兴趣的函数,但它会编译。当需要编写自己的代码时,您只需不将自己的代码定义为
\uuu-weak
并编写它即可

简单?有用吗

干杯

除了“这使泛型代码库能够始终编译。”\uuuu-weak允许您重新生成(在CubeMX中)代码,而无需接触您的uu-weak+less回调函数代码。 如果您使用以下格式编写代码:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* NOTE: This function Should not be modified, when the callback is needed,
       the HAL_UART_RxCpltCallback could be implemented in the user  file
  */
}

出于某种原因,在cubemx中进行再生。你的密码会爆炸

弱函数是可以被具有相同名称的用户函数覆盖的方法,用于定义向量表和默认处理程序

正常的函数编写(声明和定义)被认为意味着函数名不能被重新声明,您将得到编译器/链接器错误

将函数声明为可被用户代码覆盖的星期

void USART1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));

uint32_t vectors[75] __attribute__((section(".isr_vector")));

vectors[0] = STACK_START;
vectors[52] = USART1_IRQHandler;

void Default_Handler(void) {
  while(1);
}


uart1.c (user code)

void USART1_IRQHandler(){
    ...
}
在上面的示例代码中,USART1_IRQHandler被定义为弱函数,并别名为Default_handler

如果用户在uart1.c中定义USART1_IRQHandler,则用户可以使用相同的名称重写此函数,而不会出现任何编译器/链接器错误。将使用此新函数定义