Кто-то любит пирожки, а кто-то - нет.
Вот у нас есть stm8s-discovery. И нежданно-негаданно на днях появился бесплатный, открытый и работающий компилятор для stm8: sdcc.
Надо бы им что-нибудь скомпилировать и загрузить всё это в платку. Попробуем...
Первым делом скачаем сам компилятор. В релизах пока что поддержки stm8 нет, потому залезем в папку, где находятся самые свеженькие билды.
Я для винхп качал из папки i586-mingw32msvc самый новый архивчик, они загружаются по мере коммитов в репозитории.
читать дальше
Надо бы им что-нибудь скомпилировать и загрузить всё это в платку. Попробуем...
Первым делом скачаем сам компилятор. В релизах пока что поддержки stm8 нет, потому залезем в папку, где находятся самые свеженькие билды.
Я для винхп качал из папки i586-mingw32msvc самый новый архивчик, они загружаются по мере коммитов в репозитории.
читать дальше
Комманда для сборки у меня правда такая.....
NAME = main
all:
sdcc -c -mstm8 $(NAME).c
sdcc $(NAME).rel
packihx $(NAME).ihx > $(NAME).hex
rm -f *.ihx *.lnk *.lst *.map *.rel *.rst *.sym *.lk
Но компилятор выдает такое сообщение:
> "make" all clean
sdcc -c -mstm8 main.c
sdcc main.rel
ASlink-Warning-No definition of area XSEG
ASlink-Warning-No definition of area PSEG
make: *** [all] Ошибка 1
Но тем не менее файл .ihx для заливки в контроллер создает. А до комманды packihx $(NAME).ihx > $(NAME).hex таки и не доходит. Выдает вышеуказаную ошибку.
Может вы знаете что это за XSEG и PSEG ?
Как я понимаю это какие то сегменты памяти. И их нужно как то явно прописать ?
Спасибо. Буду признателен если ответите )))
Вот так примерно я компилю настоящий проект:
Буду пробовать
В двух разных вкрсиях SDCC STM8 один и тот же код компилится мало того что по разному так еще и с вариациями на тему...........)))
Вот кусок одного кода скомпилированого разными версиями SDCC. При чем одна из них свежайшая )))
Это асемблерный листинг более старой сборки (3.4.0 #8964 (Mar 31 2014) (MINGW32) ).
Как видно из листинга, комманда enableInterrupts() ни как не влияет на код.
Только меняет свое положение )))) А установка бита происходит через чтение - модификацию - запись.
1й вариант.
; -----------------------------------------
; function main
; -----------------------------------------
_main:
; main.c: 24: enableInterrupts();
rim
; main.c: 25: GPIOD->DDR |= (1 << 0);
ldw x, #0x5011
ld a, (x)
or a, #0x01
ldw x, #0x5011
ld (x), a
; main.c: 26: GPIOD->ODR |= (1 << 0);
ldw x, #0x500f
ld a, (x)
or a, #0x01
ldw x, #0x500f
ld (x), a
2й вариант
; -----------------------------------------
; function main
; -----------------------------------------
_main:
; main.c: 24: GPIOD->DDR |= (1 << 0);
ldw x, #0x5011
ld a, (x)
or a, #0x01
ldw x, #0x5011
ld (x), a
; main.c: 25: GPIOD->ODR |= (1 << 0);
ldw x, #0x500f
ld a, (x)
or a, #0x01
ldw x, #0x500f
ld (x), a
; main.c: 26: enableInterrupts();
rim
Во первых от положения комманды enableInterrupts() зависият варианты компиляции кода.
1й вариант.
; -----------------------------------------
; function main
; -----------------------------------------
_main:
; main.c: 24: enableInterrupts();
rim
; main.c: 25: GPIOD->DDR |= (1 << 0);
bset 0x5011, #0
; main.c: 26: GPIOD->ODR |= (1 << 0);
bset 0x500f, #0
2й вариант.
; -----------------------------------------
; function main
; -----------------------------------------
_main:
; main.c: 24: GPIOD->DDR |= (1 << 0);
bset 0x5011, #0
; main.c: 25: GPIOD->ODR |= (1 << 0);
ldw x, #0x500f
ld a, (x)
or a, #0x01
ld (x), a
; main.c: 26: enableInterrupts();
rim
Как видим в первом варианте используется оператор BSET.
А во втором варианте и BSET и длинная конструкция чтение - модификация - запись.
Мне было бы интересно что вы думаете по этому поводу.
В папке C:\SDCC\lib\stm8 есть библиотека stm8.lib . Но как ее можно задействовать?
Похоже что в ней есть все функции из stio и stdlib.
Я сборку делал так
all:
sdcc -v
sdcc -mstm8 $(NAME).c
sdcc -mstm8 $(NAME).rel C:\SDCC\lib\stm8\stm8.lib
packihx $(NAME).ihx > $(NAME).hex
Если функции putchar - putstring - getchar / getstring - я могу написать свои, как я это делал для AVR, то
всяческие atoi - atol - itoa - ltoa и подобные ( их я использую часто ) написать будет наверное проблематично (((.
Может синтаксис не такой как в mcs51 ? Я использовал названия функций из SDCC MCS51.
Полный пример сборки проекта (только команды компилятору) приведён выше.
Без ключа оного он пытается собрать проект тут же, но не выйдет — библиотека не подключена. Оттого и ошибки.
См. раздел 3.2.3 Projects with Multiple Source Files документации.
Но это помогло лишь частично. Функция puts("String"); к примеру ссылается на функцию putchar. Но почему то не находит ее.
?ASlink-Warning-Undefined Global '_putchar' referenced by module 'puts'
make: *** [all] Ошибка 1
Но за то заработали функции преобразования строк atoi - itoa и др )))
Посмотрите раздел 3.18.1 Compiler support routines (_gptrget, _mulint etc.) в мануале на компилятор — он как раз про putchar и getchar.
В mcs51 для этого дополнительно подключались файлы ser.h serial.h или serial_IO.h
А тут буду писать свои. Точнее уже написал.
Еще раз спасибо.