0

我在嵌入式(STM32F103)项目中使用的一些库初始化它的结构,memset()由于某种原因导致程序停止响应/挂起。

为了测试这一点,我使用了:

typedef struct
{
    uint8_t b;
    uint8_t c;
} testStruct;

testStruct d = { .b = 0, .c = 0 };

memset(&d, 0, sizeof(d));

果然这会导致相同的行为。memset()在数组上使用似乎工作正常。

我已经没有关于问题可能是什么的想法,甚至认为它可能是内存对齐问题并尝试__attribute__((aligned(4),packed))在结构上使用,但这也没有帮助。

我正在使用 GCC for ARM 来编译代码:

arm-none-eabi-gcc -std=c11 --specs=nosys.specs -fno-exceptions -Wall -O0 -nostartfiles -mcpu=cortex-m0 -mthumb -mcpu=cortex-m3 -march=armv7-m -I %IncludeDir% -o %WorkingDir%bin\main.elf -T %WorkingDir%stm32f103c8t6.ld %WorkingDir%systick.c %WorkingDir%can.c %WorkingDir%uart.c %WorkingDir%fifo.c %WorkingDir%main.c %WorkingDir%libcanard\canard.c %LibDir%libopencm3_stm32f1.a

关于我在这里缺少什么的任何想法?

编辑:

下面是完整的测试代码。我的测试很简单,我正在闪烁 LED。当memset()存在时,代码永远不会到达主循环以开始闪烁 LED。当我发表评论时memset(),LED 会闪烁。

#define STM32F1
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/stm32/usart.h>
#include <string.h>
#include "systick.h"

void loopToggleLED(uint32_t tnow)
{
    static uint32_t tPrevToggleLoop;
    static bool LEDisOn;

    if ((tnow - tPrevToggleLoop) < 1000000)
        return;

    tPrevToggleLoop = tnow;

    if (!LEDisOn)
    {
        gpio_clear(GPIOC,GPIO13);       // LED on
        LEDisOn = true;
    }
    else
    {
        gpio_set(GPIOC,GPIO13);         // LED off
        LEDisOn = false;
    }   
}

int main()
{
    rcc_clock_setup_in_hse_8mhz_out_72mhz();
    // Enable GPIOC clock. 
    rcc_periph_clock_enable(RCC_GPIOC);

    // Set GPIO8 (in GPIO port C) to 'output push-pull'.
    gpio_set_mode(GPIOC,GPIO_MODE_OUTPUT_2_MHZ,
              GPIO_CNF_OUTPUT_PUSHPULL,GPIO13);

    systick_Init();

    typedef struct
    {
        uint8_t b;
        uint8_t c;
    } testStruct;

    testStruct d = { .b = 0, .c = 0 };

    // Commenting memset() below allows the code to enter the loop below and blink the LEDs
    memset(&d, 0, sizeof(d));

    uint32_t tnow;
    for (;;) 
    {
        tnow = systick_Micros();    
        loopToggleLED(tnow);            
    }

    return 0;
}
4

1 回答 1

0

解决了!正如 KamilCuk 指出的那样,我错误地将 mcpu 标志用于 cortex-m0 和 cortex-m3。删除-mcpu=cortex-m0memset 后再次按预期工作!感谢您指出并帮助解决此问题!

于 2020-03-29T10:58:21.657 回答