【发布时间】:2015-12-27 02:33:48
【问题描述】:
当我为我的 STM32F429 CPU 编译代码时,当我使用 -O0 标志时一切正常,但一旦我使用更高的优化 (-O1, -O2, and -O3),代码就会中断。
我正在使用 ST 的 CMSIS+HAL 库和一些基本代码。
问题在于,即使 *uart_irq 被定义为 volatile,主循环中的 if (uart_irq && uart_irq->SOURCE == IRQ_SOURCE_UART)从未评估。
我试图将uart_irq 定义为volatile void *,但没有成功。
唯一有效的是uart_irq 被定义为volatile uint32_t 并且在使用时整数被转换为irq_instance,因为编译器在优化期间不会删除它。
如果有人能阐明这个问题,我会很高兴。
- 这应该是标准行为吗?
- 这是编译器中的已知错误吗?
main.h
#define API_COMMAND_SIZE 6
typedef struct irq_instance_s
{
uint8_t SOURCE;
uint8_t TYPE;
uint8_t *CONTEXT;
uint8_t SIZE;
} irq_instance;
extern volatile irq_instance *uart_irq;
main.creceive 指针在 hande_command 内部被释放
#include "main.h
volatile irq_instance *uart_irq = 0;
int main(void)
{
uint8_t *receive = 0;
<Initialize stuff>
/* Initialize first UART recieve */
receive = malloc(API_COMMAND_SIZE);
while (HAL_UART_Receive_IT(&huart1, receive, API_COMMAND_SIZE) == HAL_BUSY);
/* Program Main loop */
while(1) {
if (uart_irq && uart_irq->SOURCE == IRQ_SOURCE_UART) { /* <---- Problem is here */
handle_interrupt(uart_irq);
free((void *)uart_irq);
uart_irq = 0;
}
}
}
stm32f4xx_it.c
在每次成功的 UART 接收后调用HAL_UART_RxCpltCallback。
#include "main.h"
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t *receive = 0;
uart_irq = calloc(1, sizeof(irq_instance));
uart_irq->SOURCE = IRQ_SOURCE_UART;
uart_irq->CONTEXT = huart->pRxBuffPtr - huart->RxXferSize;
uart_irq->SIZE = huart->RxXferSize;
uart_irq->TYPE = IRQ_TYPE_COMMAND;
receive = malloc(API_COMMAND_SIZE);
while (HAL_UART_Receive_IT(&huart1, receive, API_COMMAND_SIZE) == HAL_BUSY);
}
【问题讨论】:
-
我不确定我是否完全理解您为什么希望它不稳定。你想让指针还是指针对象是可变的?
-
uart_irq没有声明为volatile,而是它指向的对象!
标签: c gcc optimization volatile