Некоторая библиотека, которую я использую во встроенном (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))
в структуре, но это также не помогло.
Я использую G CC для 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
Есть какие-нибудь идеи относительно того, чего мне здесь не хватает?
РЕДАКТИРОВАТЬ:
Ниже приведен полный тестовый код. Мой тест прост, я мигаю светодиодом. Когда присутствует memset()
, код никогда не достигает основного значения l oop, чтобы начать мигать светодиодом. Когда я комментирую memset()
, светодиод мигает.
#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;
}