Пришла пора привести в понятный вид скрипт линковки для прошивки под STM32 (или любой другой ARM Cortex-M).
Прошлый раз мы писали как попало и не очень понятно было, где и что лежит. Будем устранять непонятности.
Я все время говорю – символы, секции. Давайте займемся терминологией.
Первое и главное – это символ. Для компоновщика символ это именованный адрес не более того. (правда похоже на переменную в любом языке программирования?). Причем не важно, что скрывается под этим символом – адрес переменной, код функции, все что угодно. Плюс некоторые «атрибуты», такие как принадлежность к секции, размер. Когда в коде написано uint32_t var_a = 12345;
, при компиляции создается символ var_a
, в атрибуты помещается размер в 4 байта и принадлежность к секции .data
(мы уже говорили, что инициализированные переменные попадают в эту секцию). Для функций – примерно тоже самое, только секция будет .text
, ну и размер нельзя вот прямо так сразу назвать, но после компиляции он конечно же будет известен.
Continue reading
Category Archives: Всякое
Прозрачный gVim в windows
Такие дела..
Немного указательных трюков AVR
Очень и очень часто приходится манипулировать кучей никак не связанных между собой пинов, вот и возникают куча дифайнов и прочей лабуды.
Есть довольно простое решение, немного тормознее, чем хардкод, и память кушает, но много удобнее.
В принципе, ничего нового для программистов я не скажу, а вот для тех у кого в голове ARDUINO, будет полезно
Оформляем структуру в которой будем хранить пины:
1 2 3 4 | typedef struct { volatile uint8_t *port; uint8_t pin; } out_t; |
а дальше создаем массив этих структур:
1 2 3 4 | out_t outs = { { &PORTA, PA1}, { &PORTB, PB4}, }; |
ну и так далее. Получается удобно проходить в цикле.
1 2 3 4 | uint8_t i; for(i=0;i<sizeof(outs)/sizeof(out_t);i++){ *outs[i].port |= _BV(outs[i].pin); } |
ну и как бонус — инициализация. в AVR регистр направления DDRx всегда на 1 байт младше, чем соответствующий PORTx, получается небольшой трюк:
1 2 3 4 | uint8_t i; for(i=0;i<sizeof(outs)/sizeof(out_t);i++){ *(outs[i].port-1) |= _BV(outs[i].pin); } |
- инициализация на выход всего массива. Это много медленнее, чем одной операцией проставить все нужные пины, но если время не критично — поддерживать такой код порядком проще: добавили запись в массив — и готово.
Да, чтобы не тратить память, можно все это хранить в PROGMEM и доставать по необходимости.
ну и еще напоследок, удобный макрос от разработчиков ядра Linux для ловли багов:
1 2 3 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) // и его применение BUILD_BUG_ON(sizeof(phs_entry_t) != sizeof(uint32_t)); |
если структура phs_entry_t размером не равна uint32_t (32 бита) — код не соберется
Eagle CAD drill-aid inverted PS
Drill-aid.upl хорошая штука, да вот драйвер PS игла на неё плюет, поискав немного, решение таки нашлось у немцев
Continue reading
PyCharm, OSX & Java 8
Чтобы не ругалось, правим /Applications/PyCharm.app/Contents/Info.plist
на предмет
<key>JVMVersion</key> <string>1.8*</string> |
Откат iOS8 beta
После того, как все поигрались, потеряли сеть итд, хочется обратно нормальной стабильной работы.
Откатывать как обычно:
- Подключаем к компьютеру
- Вводим телефон в режим DFU: удерживаем Home+Power 10 секунд (экран отключится), отпускаем Power, и ждем еще 10 секунд, отпускаем Home
- iTunes найдет телефон в режиме восстановления и предложит поставить на него текущий релиз iOS (на сейчас это 7.1.1) — устанавливаем
- После завершения установки, будет предложено восстановить из резервной копии (вы ведь сделали её?)
- Ждем более стабильной беты
Дед
Переезд =(
В связи с трагической гибелью веб-сервера переезжаем.. Некоторые ресурсы недоступны
Kinamania.com
Не так давно Павел Гринёв (aka Kinaman) запустил таки сайт о страшных, но ностальгичных 90х.
Тем кто провел детство в эту ужасную эпоху — крайне рекомендуется посетить ресурс:
kinamania.com
А еще можно посмотреть его замечательный фильм «Проклятие серого слонёнка»