При сборке программы с помощью Sourcery CodeBench и скрипта линкера «Device/ARM/ARMCM0/Source/GCC/gcc_arm.ld» из CMSIS v3.20 линкер выдает ошибку:

cannot find libnosys.a

Наверное, за это в ответе строка из скрипта:

/* Library configurations */
GROUP(libgcc.a libc.a libm.a libnosys.a)

Проблема решилась использованием скрипта «Device/ARM/ARMCM0/Source/G++/gcc_cs.ld».

 

Реклама

При компиляции core_cm3.c из STM32F10x SPL v3.5.0 компилятор (gcc из Sourcery CodeBench) выдает ошибки:

Error: registers may not be the same — `strexb r0,r0,[r1]’
Error: registers may not be the same — `strexh r0,r0,[r1]’

Такой код по разному воспринимается разными компиляторами:

const int data_size = 7;
int data[data_size] = {1,2,3,4,5,6,7};

Если использовать компилятор из Keil MDK-ARM, то код компилируется и работает нормально. Но компилятор (gcc) из Sourcery Сodebench выдает ошибку:

variable-sized object may not be initialized

При этом, без ошибок компилируется код:

const int data_size = 7;
int data[data_size];

Чтобы протестировать работу COM-порта, иногда полезно соединить линию RXD с линией TXD. Если разъем типа «папа», то соединить линии можно с помощью обыкновенного джампера, благо контакты в разъеме расположены рядом.

Почему чип-конденсаторы и индуктивности не маркируют так же, как резисторы цифрами и буквами?

Многие программисты микроконтроллеров любят подключать все заголовочные файлы в одном основном заголовочном файле. А потом основной заголовочный файл подключать во всех модулях.

Это плохое программирование. Например, если вы сделаете изменение в любом второстепенном заголовочном файле, то сборочная утилита подумает, что внесены изменения во все модули, и станет их перекомпилировать, когда в этом не будет надобности.

Мнемоника

Существует формула Q=CU, связывающая напряжение, емкость и заряд конденсатора. Формулу можно запомнить по её произношению:

ку-цу

При сложении или вычитании двух синусоид с одинаковой частотой, получается синусоида с той же частотой, но с особыми фазой и амплитудой, которые зависят от фаз и амплитуд изначальных синусоид и от операции между ними.

Си: преобразование double или float в массив char:

double d;
char * ba = (char *)(&d);

Теперь, обращаясь к элементам массива ba, можно узнать из чего состоит переменная типа double или сформировать её из отдельных байт:

ba[0]; // Первый байт
ba[sizeof(d)-1]; // Последний байт

Семисегментные индикаторы

Если количество семисегментных индикаторов равно N. То с их помощью можно отображать целые числа из диапазона от

1-10^{N-1}

до

10^{N}-1

включительно.

Например, с помощью трех семисегментных индикаторов можно отобразить числа от -99 до 999 включительно.

Формулы могут помочь в программировании, если надо проверить входит ли число, выводимое на индикатор из семисегментников, в диапазон значений. При этом потребуется задать лишь количество семисегментников.