Кто-то любит пирожки, а кто-то - нет.
Вот у нас есть stm8s-discovery. И нежданно-негаданно на днях появился бесплатный, открытый и работающий компилятор для stm8: sdcc.
Надо бы им что-нибудь скомпилировать и загрузить всё это в платку. Попробуем...

Первым делом скачаем сам компилятор. В релизах пока что поддержки stm8 нет, потому залезем в папку, где находятся самые свеженькие билды.
Я для винхп качал из папки i586-mingw32msvc самый новый архивчик, они загружаются по мере коммитов в репозитории.

читать дальше

@темы: sdcc, программизмы, stm8sdiscovery

Комментарии
26.10.2013 в 17:49

A
06.04.2014 в 09:58

Здравствуйте. Я попробовал откомпилить файл main.c из вашего примера.
Комманда для сборки у меня правда такая.....

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 ?
Как я понимаю это какие то сегменты памяти. И их нужно как то явно прописать ?

Спасибо. Буду признателен если ответите )))
06.04.2014 в 15:21

Кто-то любит пирожки, а кто-то - нет.
Гость, надо указывать тип контроллера везде: не только при компиляции, но и при линковке=)

Вот так примерно я компилю настоящий проект:

06.04.2014 в 21:11

Спасибо огромное !!!!!!
Буду пробовать
11.04.2014 в 01:29

Здравствуйте. Я так понимаю что вы не пользуете SDCC STM8 постоянно, а лишь поставили его в качестве обучающего примера?
11.04.2014 в 17:08

Кто-то любит пирожки, а кто-то - нет.
Гость, отнюдь. Только им и пользуюсь =D
11.04.2014 в 22:59

Я нашел как мне кажется какой то баг, но не знаю как донести это миру )))
В двух разных вкрсиях 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
11.04.2014 в 23:00

А вот в самой свежей версии ( 3.4.0 #8981 (Apr 10 2014) (MINGW32) ) происходят странные на мой взгляд вещи.
Во первых от положения комманды 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 и длинная конструкция чтение - модификация - запись.

Мне было бы интересно что вы думаете по этому поводу.
14.04.2014 в 11:08

Кто-то любит пирожки, а кто-то - нет.
Гость, я посмотрю на неделе, как это так выходит =)
16.04.2014 в 11:29

Здравствуйте! Не подскажете, есть ли для stm8 поддержка stdio и stdlib ( такие библиотеки есть в mcs51 )?
В папке C:\SDCC\lib\stm8 есть библиотека stm8.lib . Но как ее можно задействовать?
Похоже что в ней есть все функции из stio и stdlib.
16.04.2014 в 13:20

Кто-то любит пирожки, а кто-то - нет.
Гость, подключить при линковке:

16.04.2014 в 23:18

К сожалению не заработало (((
Я сборку делал так
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.
17.04.2014 в 09:53

Кто-то любит пирожки, а кто-то - нет.
Гость, си-файлы компилируются с ключом -c
Полный пример сборки проекта (только команды компилятору) приведён выше.
Без ключа оного он пытается собрать проект тут же, но не выйдет — библиотека не подключена. Оттого и ошибки.

См. раздел 3.2.3 Projects with Multiple Source Files документации.
17.04.2014 в 14:20

Да, вы правы. Это мой косяк ((( Я куда то задевал ключ -с.
Но это помогло лишь частично. Функция puts("String"); к примеру ссылается на функцию putchar. Но почему то не находит ее.

?ASlink-Warning-Undefined Global '_putchar' referenced by module 'puts'
make: *** [all] Ошибка 1

Но за то заработали функции преобразования строк atoi - itoa и др )))
17.04.2014 в 14:26

Кто-то любит пирожки, а кто-то - нет.
Гость, а обычно эту функцию надо самому писать — библиотека ж не знает, куда надо выводить символы: в уарт, в спи, на карту памяти, на монитор...

Посмотрите раздел 3.18.1 Compiler support routines (_gptrget, _mulint etc.) в мануале на компилятор — он как раз про putchar и getchar.
18.04.2014 в 11:52

Спасибо большое. Разобрался.
В mcs51 для этого дополнительно подключались файлы ser.h serial.h или serial_IO.h
А тут буду писать свои. Точнее уже написал.
Еще раз спасибо.