Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SDCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
sergey sva
Сейчас пишу програмку для мк 89с51ed2, память у него конфигурируется в регистре AUXR и может быть
768 1024 1792. Когда писал программу под KEIL там был файл Startup.asm в нем после
метки Startup: можно было настроить все что нужно. В SDCC файл есть main.asm но если в него добавить
что то то, после компиляции все равно будет сгенерирован новый main.asm а этот заменяется.
на сайте sdcc есть что то по настройке, startup http://sdcc.sourceforge.net/doc/sdccman.html/node78.html
но что то мне это не чего не говорит, может кому приходилось это настраивать, помоги настроить пожалуйста.
AHTOXA
Там же в конце написано:
Цитата
The recommended way would be to copy crtstart.asm (f.e. from http://sdcc.svn.sourceforge.net/viewvc/*ch...1/crtstart.asm) into the source directory, adapt it there, then assemble it with asx8051 -plosgff3.4 crtstart.asm and when linking your project explicitely specify crtstart.rel. As a bonus a listing of the relocated object file crtstart.rst is generated.


Перевожу: скопировать crtstart.asm себе в проект, исправить, ассемблировать его в rel и слинковать со своим проектом.

Или другой вариант (проще, но не уверен что прокатит): объявить в своей программе ф-ю
int _sdcc_external_startup(void)
и там всё что надо проинициализировать.
sergey sva
скопировал crtasm.asm в директорию source, добавил все настройки в него. теперь нужно
получить объектный файл и после его откомпилировать(если ошибаюсь поправьте)
Вот макефиле только почемуто не создается crtstart.rel


Код
СC=sdcc
as=asx8051
LINKFLAGS=--model-large --code-loc 0x0000 --code-size 0xFFFF --xram-loc 0x0000 --xram-size 0x0700
all: main.hex

    
main.rel: main.c
    $(CC) $(LINKFLAGS)-c main.c

crtstart.rel: crtstart.asm
    $(as)  o crtstart.asm




    
main.hex: main.rel
    $(CC) $(LINKFLAGS) main.rel crtstart.rel
    packihx <main.ihx>main.hex



clean:

     @del *.hex *.ihx *.lnk *.mem *.rel *.rst *.sym *.lst *.map
AHTOXA
Цитата(sergey sva @ Aug 11 2008, 21:01) *
Вот макефиле только почемуто не создается crtstart.rel

Вы так и не почитали ничего про make? Я понимаю, англицкий выучить - дело долгое. Но разобраться в основах make - дело пары вечеров! Вот ссылка, почитайте третью главу, там всё хорошо описано.
А crtstart.rel не создаётся потому, что не прописана зависимость main.hex от него:
Код
main.hex: main.rel crtstart.rel
sergey sva
Цитата(AHTOXA @ Aug 11 2008, 20:05) *
Вы так и не почитали ничего про make? Я понимаю, англицкий выучить - дело долгое. Но разобраться в основах make - дело пары вечеров! Вот ссылка, почитайте третью главу, там всё хорошо описано.
А crtstart.rel не создаётся потому, что не прописана зависимость main.hex от него:
Код
main.hex: main.rel crtstart.rel

благодарю, прочитаю обязательно smile.gif
sergey sva
Информацию по make и makefile, прочел вроде понятно. Вот что в доке написано, вроде так и делаю.
Цитата
While these initialization modules are meant as generic startup code there might be the need for customization.
Let’s assume the return value of _sdcc_external_startup() in crtstart.asm should not be checked (or
_sdcc_external_startup() should not be called at all). The recommended way would be to copy crtstart.asm (f.e.
from http://sdcc.svn.sourceforge.net/viewvc/*ch...vice/lib/mcs51/
crtstart.asm) into the source directory, adapt it there, then assemble it with asx8051 -plosgff 4 crtstart.asm and
when linking your project explicitely specify crtstart.rel. As a bonus a listing of the relocated object file crtstart.rst
is generated.

Вот makefile :
Код
CC=sdcc
AS=asx8051
LINKFLAGS=--model-large --code-loc 0x0000 --code-size 0xFFFF --xram-loc 0x0000 --xram-size 0x0700
all: main.hex
    
main.rel: main.c
    $(CC) $(LINKFLAGS) -c main.c



crtstart.rel:  crtstart.asm
    $(AS)  -plosgff  crtstart.asm



main.hex: main.rel  crtstart.rel
    $(CC) $(LINKFLAGS) main.rel  crtstart.rel
    packihx <main.ihx>main.hex


clean:

    @del *.hex *.ihx *.lnk *.mem *.rel *.rst *.sym *.lst *.map


Все компилится получается хекс, но только просматриваю сгенерированный файл main.asm
он должен получится из двух объектных файлов main.rel crtstart.rel а там только от main.rel
может что не так сделал в макефайле ?
AHTOXA
Из main.c генерится main.asm, потом он транслируется в main.rel.
А crtstart - он уже и так .asm, потому из него делается сразу crtstart.rel.
sergey sva
Цитата(AHTOXA @ Aug 20 2008, 20:07) *
Из main.c генерится main.asm, потом он транслируется в main.rel.
А crtstart - он уже и так .asm, потому из него делается сразу crtstart.rel.


Понятно. smile.gif Еще есть проблемка в crtstart.asm Есть строка mov 0x8e , #0x10.
Записываю в регистр 0x8e значение 0x10.(Во время инициализации)
После в программе вывожу на дисплей значение этого регистра, содержание его 0x80 вместо 0x10.
функция которая выводит на дисплей работает нормально, проверял. Сегодня целый день
провозился уже не знаю где искать. Может что в hex можно увидеть.
AHTOXA
А что это за регистр такой?
sergey sva
Цитата(AHTOXA @ Aug 20 2008, 22:45) *
А что это за регистр такой?

Регистр AUXR в нем настраивается размер памяти XRAM 256 512 768 1024 или 1792.
Сегодня с утра посмотрел на код и сразу дошло, что на дисплее информация int а 0х10 это hex, еще в этом регистре есть бит который зарезервирован и читается как 1; поэтому записываю 0х10 а получается 0х50. Но проблема еще не решена, просто я не там искал.
Проблема вот какая: если размер XRAM превышает 256,байт , то программа зависает. На самом деле
должна работать до 1792. отрывок из документации в зипе.

makefile

Код
CC=sdcc
AS=asx8051
LINKFLAGS=--model-large --code-loc 0x0000 --code-size 0xFFFF --xram-loc 0x0000 --xram-size 0x0700
all: main.hex
    
main.rel: main.c
    $(CC) $(LINKFLAGS) -c main.c



crtstart.rel:  crtstart.asm
    $(AS)  -plosgff  crtstart.asm



main.hex: main.rel  crtstart.rel
    $(CC) $(LINKFLAGS) main.rel  crtstart.rel
    packihx <main.ihx>main.hex


clean:

    @del *.hex *.ihx *.lnk *.mem *.rel *.rst *.sym *.lst *.map


main.mem
Код
Internal RAM layout:
      0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a|b|b|b|b|b|b|Q|
0x10:|Q|Q| | | | | | | | | | | | | | |
0x20:|B|B|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute

Stack starts at: 0x22 (sp set to 0x21) with 222 bytes available.

Other memory:
   Name             Start    End      Size     Max    
   ---------------- -------- -------- -------- --------
   PAGED EXT. RAM                         0      256  
   EXTERNAL RAM     0x0000   0x0151     338     1792  
   ROM/EPROM/FLASH  0x0000   0x1dd6    7639    65535
SergeiCh
В документации на sdcc написано, что _sdcc_external_startup(), о которой писал AHTOXA, как раз и предназначена для инициализации памяти. Если это можно сделать на Си, зачем писать на ассемблере?
Код
int _sdcc_external_startup(void)
{
    AUXR = XRS2;
    return 0;
}


Цитата
Проблема вот какая: если размер XRAM превышает 256,байт , то программа зависает.

До main доходит, или раньше зависает?
_Pasha
Господа!
Если кому не в напряг, выложите, пожалуйста, пример makefile для SDCC с прикручиванием его к MPLAB. А то какой-то капризный этот mpasmwin...
msalov
Цитата(_Pasha @ Oct 28 2008, 08:50) *
Господа!
Если кому не в напряг, выложите, пожалуйста, пример makefile для SDCC с прикручиванием его к MPLAB. А то какой-то капризный этот mpasmwin...

Что может быть проще. Берите пример проекта в MPLAB-е и экспортируйте мейкфайл.
Код
# MPLAB IDE generated this makefile for use with GNU make.
# Project: MCHPUSB.mcp
# Date: Tue Oct 28 09:57:19 2008

AS = mpasmwin.exe
CC = mcc18.exe
LD = mplink.exe
AR = mplib.exe
RM = rm

MCHPUSB.cof : usbmmap.o usbdrv.o usb9.o usbdsc.o usbctrltrf.o user.o cdc.o crc.o settings.o cmd.o time.o ftoa.o history.o main_usb.o flash.o btobcd.o itobcd.o ltobcd.o button_lang.o Calculation_DER_DE.o lcd.o main.o menu.o menu_lang.o mkstr.o sound.o StateParent.o t1read.o t1write.o t3write.o upvv.o sysparams.o _time.o
    $(LD) /p18F67J50 /l"C:\MCC18\lib" /k"C:\MCC18\lkr" "usbmmap.o" "usbdrv.o" "usb9.o" "usbdsc.o" "usbctrltrf.o" "user.o" "cdc.o" "crc.o" "settings.o" "cmd.o" "time.o" "ftoa.o" "history.o" "main_usb.o" "flash.o" "btobcd.o" "itobcd.o" "ltobcd.o" "button_lang.o" "Calculation_DER_DE.o" "lcd.o" "main.o" "menu.o" "menu_lang.o" "mkstr.o" "sound.o" "StateParent.o" "t1read.o" "t1write.o" "t3write.o" "upvv.o" "sysparams.o" "_time.o" /u_CRUNTIME /u_DEBUG /u_DEBUGDATASTART=0xef4 /u_DEBUGDATALEN=0xc /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /z__MPLAB_DEBUGGER_ICD2=1 /z__ICD2RAM=1 /m"MCHPUSB.map" /w /o"MCHPUSB.cof"

usbmmap.o : system/usb/usbmmap.c system/usb/class/cdc/cdc.h system/usb/usbdrv/usbdrv.h system/usb/usbmmap.c system/typedefs.h system/usb/usb.h autofiles/usbcfg.h system/usb/usbdefs/usbdefs_std_dsc.h autofiles/usbdsc.h system/usb/usbdefs/usbdefs_ep0_buff.h system/usb/usbmmap.h system/usb/usbctrltrf/usbctrltrf.h system/usb/usb9/usb9.h
    $(CC) -p=18F67J50 /i"C:\MCC18\h" "system\usb\usbmmap.c" -fo="usbmmap.o" -D__DEBUG -k -mL -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

.......

clean :
    $(RM) "usbmmap.o" "usbdrv.o" "usb9.o" "usbdsc.o" "usbctrltrf.o" "user.o" "cdc.o" "crc.o" "settings.o" "cmd.o" "time.o" "ftoa.o" "history.o" "main_usb.o" "flash.o" "btobcd.o" "btobcd.ERR" "btobcd.lst" "itobcd.o" "itobcd.ERR" "itobcd.lst" "ltobcd.o" "ltobcd.ERR" "ltobcd.lst" "button_lang.o" "Calculation_DER_DE.o" "lcd.o" "main.o" "menu.o" "menu_lang.o" "mkstr.o" "sound.o" "StateParent.o" "t1read.o" "t1write.o" "t3write.o" "upvv.o" "sysparams.o" "_time.o" "MCHPUSB.cof" "MCHPUSB.hex" "MCHPUSB.map"
_Pasha
Цитата(gotty @ Oct 28 2008, 11:01) *
Что может быть проще. Берите пример проекта в MPLAB-е и экспортируйте мейкфайл.

У меня после компилера SDCC получается асмовый файл. Далее - асм и линкер мплабовский.
Проблема в том, что я выдрал где-то такой файл, и начал его переделывать
Код
PIC = 18f2431

NAME = MControl
PRJDIR = $(CURDIR)
SDCCDIR = C:/sdcc

SRC = main.c
SRCASM =
INCLUDE = -I$(SDCCDIR)/include/pic16

CC = $(SDCCDIR)/bin/sdcc
ASM = "C:/Program Files/Microchip/MPASM Suite/"mpasmwin.exe
LOAD =
#
#Note : rewrited for use with mpasmwin in command line mode
#ASMFLAGS = -c
ASMFLAGS = /c+ /m+ /o+
CFLAGS = -mpic16 -p$(PIC)
LDFLAGS = $(CFLAGS) -l libc18f.lib
OBJS = $(patsubst %.c,%.o,$(SRC)) $(patsubst %.asm,%.o,$(SRCASM))
LSTS = $(patsubst %.c,%.lst,$(SRC)) $(patsubst %.asm,%.lst,$(SRCASM))
ASMS = $(patsubst %.c,%.asm,$(SRC))

all: $(NAME).hex

$(NAME).hex : $(OBJS) $(SRC) $(SRCASM)
    @echo -n "Linking ... "
    @$(CC) -o $@ $(LDFLAGS) $(OBJS)
    @ls -l $@
    @echo "done"

%.o: %.asm
    @echo "Assembling ... $<"
    $(ASM) $(ASMFLAGS) $(PRJDIR)/$<

%.o: %.c
    @echo "Compiling ... $<"
    @$(CC) $(INCLUDE) $(CFLAGS) -S -c $<
    @$(ASM) $(ASMFLAGS) $*.asm

clean :
    @rm -f $(ASMS) $(LSTS) $(OBJS) $(NAME).lst $(NAME).hex $(NAME).cod


За линкер просьба не пинать - я до него еще не дошел.

Короче, при вызове $(ASM) $(ASMFLAGS) $(PRJDIR)/$< ,mpasmwin получает в командную строку путь $(PRJDIR) в линуксоидном формате и начинает рассказывать, что файл не найден. Попытка заставить асм взять файл из текущей директории - те же яйца. В общем, только с полными путями. Как проще всего слеши поменять ?
msalov
Цитата(_Pasha @ Oct 28 2008, 11:50) *
У меня после компилера SDCC получается асмовый файл. Далее - асм и линкер мплабовский.
Проблема в том, что я выдрал где-то такой файл, и начал его переделывать

За линкер просьба не пинать - я до него еще не дошел.

Короче, при вызове $(ASM) $(ASMFLAGS) $(PRJDIR)/$< ,mpasmwin получает в командную строку путь $(PRJDIR) в линуксоидном формате и начинает рассказывать, что файл не найден. Попытка заставить асм взять файл из текущей директории - те же яйца. В общем, только с полными путями. Как проще всего слеши поменять ?


А может имеет смысл использовать все инструменты из одного комплекта?

Первая ссылка на запрос в гугле "mplab using sdcc compiler" выводит на на http://lne.byexamples.com/?p=21
Сам не пробовал, так что если не заработает - извините.
Сергей Борщ
Цитата(_Pasha @ Oct 28 2008, 12:50) *
Короче, при вызове $(ASM) $(ASMFLAGS) $(PRJDIR)/$< ,mpasmwin получает в командную строку путь $(PRJDIR) в линуксоидном формате
Это проблема с вашим make. Точнее, скорее всего у вас make от cygwin. Возьмите свежий со странички MSYS - у него с путями порядок.


Цитата(gotty @ Oct 28 2008, 14:06) *
А может имеет смысл использовать все инструменты из одного комплекта?
Я использовал sdcc в связке с gputils. Формат исходника и командной строки для ассемблера из gputils отличается от ассемблера mplab. Если не изменянет память, sdcc имеет специальный ключ для генерации файла под mpasm.
_Pasha
Цитата(gotty @ Oct 28 2008, 14:06) *
А может имеет смысл использовать все инструменты из одного комплекта?

Спасибо за ссылку. Но она ориентирована на работу с gplink & gpasm... В первом приближении вроде работает, но там нету ни экспорта, ни самого makefile. Подождем, может кто что добавит...
O_o уже добавили.
Цитата(Сергей Борщ @ Oct 28 2008, 15:10) *
Это проблема с вашим make.

Большое спасибо!
Цитата
Если не изменянет память, sdcc имеет специальный ключ для генерации файла под mpasm.

Я включаю -S --mplab-comp
Сергей Борщ
Цитата(_Pasha @ Oct 28 2008, 15:48) *
Я включаю -S --mplab-comp
Я не нашел его в приведенном вами makefile, поэтому счел нужным обратить внимание. Ну, если есть - все пучком!
msalov
У меня складывается впечатление что MPLAB не использует makefile для сборки проекта, но может их создавать для пользователя. По сему создание мейкфайла - заняте бесполезное.
Как выход вижу написание небольшого shell-скрипта в котором вы будете компилировать исходники в асм-файлы, которые будут включены в проект обчным образом. Ну а для вызова этого скрипта будет использоваться настройка проекта Project -> Build Options -> Project -> Custom Build -> Prebuild Step, где Вы и пропишете свой чудо-скрипт.
_Pasha
Цитата(Сергей Борщ @ Oct 28 2008, 15:54) *
все пучком!

Немного победИл. Итого.
1. Поставил mingw32-make3.81
2. После этого стало возможно добавить путь в виде
Код
ASM = C:/Program Files/Microchip/MPASM Suite/mpasmwin.exe


Как выяснилось, глюки ползли из-за попыток обойти многословные виндовые названия при помощи кавычек. Т.е. в старых мейках без кавычек не запускался mpasmwin. В новом - нормально.
Теперь, запуск асма отдался легко и с радостью
Код
$(ASM) $(ASMFLAGS) $<

Т.е. пути к исходнику не нужны.
Далее, буду с линкером воевать.
Всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.