hitech-c picc18 -- оптимальное кодирование

Aug 17, 2006 8 Replies

Немедленно нажми на RESET, All!



Посоветуйте где почитать (мануалы изучил) на счёт написания более-менеe оптимального кода для сабжевой платформы.



Вот у меня после компиляции rdata (access bank, который COMRAM класс) занимает 13 байт. Следовательно оно за каждой переменной очень сложными методами обращается, аж в листинг страшно смотреть. А в -Bsmall уже не лезет. Выборочно near прописывать? Могло бы и само.



PS: DO опять жжот. Как было половина опций недокументировано, так и осталось. И ещё добавили, в стиля GNU...



PPS: Вопрос на засыпку -- как инициализировать структуру в eeprom, средствами языка C (т.е. считать sizeof() вручную -- не предлагать)?



 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Kirill Frolov! You wrote in conference fido7.ru.embedded on Thu, 17 Aug 2006 09:11:20

+0000 (UTC):

KF> Посоветуйте где почитать (мануалы изучил) на счёт написания KF> более-менеe оптимального кода для сабжевой платформы.

Почитать про архитектуру кристалла, представлять себе какие действия какой код порождают и исходя из этого и писать.

KF> PS: DO опять жжот. Как было половина опций недокументировано, так и KF> осталось. И ещё добавили, в стиля GNU...

Какие именно опции конкретно не документированы?

KF> PPS: Вопрос на засыпку -- как инициализировать структуру в eeprom, KF> средствами языка C (т.е. считать sizeof() вручную -- не предлагать)?

AFAIK - никак.

dima

formatting link

Это конечно понятно. Но для этого опыта набраться надо. Я на picc18 ранее не писал. Я конечно понимаю, что более одного аргуента размера FAST ему лучше не подсовывать и прочие вещи характерные для 8 бит, но у pic, по сравнение с x51, например, своя специфика. Код как-то веселей выглядит, но всё равно страшно.

picc -v -v -v ... и сам смотри. А их там -- в 2 раза больше ещё.

Если ручками позвать cpp, c1, pgen и т.п., до получения ассемблера, из которого потомм sed'ом вырезать лишнее -- то можно. Впрочем можно просто сгенерить вначале асемблер (-S) он (ассемблер -- он два раза вызывается) изматерится, но файл выдаст, а в нём, как ни странно, psect eeprom_data с неверным class=CODE уже почему-то отсутствует. Остаётся ещё раз пропустить через ассемблер и получить готовый к компоновке объектный файл с байтами в eeprom. Вот для чего и нужен Makefile. В "IDE" может действительно -- никак. НЕ знаю.

Пример:

eeprom_data.obj: eeprom_data.as

eeprom_data.as: hardware/eeprom_data.c # warning приводящий к ошибке - игнорируется $(CC) $(CFLAGS) -S -o$@ $< || true

#include "eeprom.h"

asm("\tpsect eeprom_data,class=EEDATA"); #pragma psect const=eeprom_data const struct s_eeprom_data ee_conf = #include "def_conf.c" ;

как в picc18 таблицу глобальных символов модуля проще посмотреть? (я dump конечно умею, но мне бы в листинге)

KF> PPS: Вопрос на засыпку -- как инициализировать структуру в eeprom, KF> средствами языка C (т.е. считать sizeof() вручную -- не предлагать)? если бы программатор поддерживал bin-ы с разными секциями то в случае с компиляцией и сборкой с помощью gcc такое было бы возможно :)

хотя в принципе можно Makefile'ом генерить несколько hex-файлов из одного .elf.

eeprom.hex: $(TARGET).elf avr-objcopy -O ihex -j .eeprom $< $@ flash.hex: $(TARGET).elf avr-objcopy -O ihex -R .eeprom $< $@

но опять же остается вопрос поддерживает ли программатор загрузку сразу двух раздельных hex-файлов.

в принципе если взять программатор AS2/3 от argussoft, то у них такая поддержка есть :)

On 15:27 Thu 17 Aug , Dmitry E. Oboukhov wrote: KF>> PPS: Вопрос на засыпку -- как инициализировать структуру в eeprom, KF>> средствами языка C (т.е. считать sizeof() вручную -- не предлагать)? DEO> если бы программатор поддерживал bin-ы с разными секциями то в случае с DEO> компиляцией и сборкой с помощью gcc такое было бы возможно :) DEO>

DEO> хотя в принципе можно Makefile'ом генерить несколько hex-файлов из DEO> одного .elf. DEO>

DEO> eeprom.hex: $(TARGET).elf DEO> avr-objcopy -O ihex -j .eeprom $< $@ DEO> flash.hex: $(TARGET).elf DEO> avr-objcopy -O ihex -R .eeprom $< $@ DEO>

DEO> но опять же остается вопрос поддерживает ли программатор загрузку сразу DEO> двух раздельных hex-файлов. DEO>

DEO> в принципе если взять программатор AS2/3 от argussoft, то у них такая DEO> поддержка есть :) сорри PS: не дописал

PS: а для pic'ов надо ждать когда для них gcc появиццо ;)

KF> eeprom_data.as: hardware/eeprom_data.c KF> # warning приводящий к ошибке - игнорируется KF> $(CC) $(CFLAGS) -S -o$@ $< || true тут можно писать

-$(CC) чтобы игнорировать ошибку

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Kirill Frolov! You wrote in conference fido7.ru.embedded to Dmitry Orlov on Thu, 17 Aug

2006 09:45:08 +0000 (UTC):

KF> FAST ему лучше не подсовывать и прочие вещи характерные для 8 бит, KF> но у pic, по сравнение с x51, например, своя специфика. Код как-то KF> веселей выглядит, но всё равно страшно.

Я как-то не особо туда заглядываю, работает - и ладно.

KF>>> PS: DO опять жжот. Как было половина опций недокументировано, так KF>>> и осталось. И ещё добавили, в стиля GNU... >> Какие именно опции конкретно не документированы?

KF> picc -v -v -v ... и сам смотри. А их там -- в 2 раза больше ещё.

C:\HTSOFT\PIC18\BIN>picc -v -v -v HI-TECH PICC COMPILER (Microchip PICmicro) V9.50PL2 Copyright (C) 1984-2006 HI-TECH SOFTWARE licensed for evaluation purposes only this licence will expire on Mon, 29 May 2006 (902) no chip name specified; use "PICC" --CHIPINFO to see available chip names

Что-то ты не то говоришь... Если ты под -v -v -v имеешь в виду --help, то все это в pdf'е и бумажной документации описано. Повторяю вопрос. Какая _конкретно_ опция не документирована.

KF>>> PPS: Вопрос на засыпку -- как инициализировать структуру в eeprom, KF>>> средствами языка C (т.е. считать sizeof() вручную -- не KF>>> предлагать)? >> AFAIK - никак.

KF> Если ручками позвать cpp, c1, pgen и т.п., до получения KF> ассемблера, из которого потомм sed'ом вырезать лишнее -- то можно. KF> Впрочем можно просто сгенерить вначале асемблер (-S) он (ассемблер KF> -- он два раза вызывается) изматерится, но файл выдаст, а в нём, как

Тогда уж проще сразу hex сгенерить, но все это уже не "средствами С".

dima

formatting link

Это ты после -v ещё впиши чего делать собрался. А оно тебе с комментариями выдаст. Например:

picc18 -v -I. -Ihardware -DTEST_FLAG -q --asmlist -G -Blarge --opt=all

--chip=18F2520 --char=signed -c -omain.obj main.c

-Zg9

Ты посмотри хоть, мплаб тоже всё это выводит...

Или вот классы памяти. По обрывкам документации от разных версий компиляторов более-менее целостное представление конечно складывается, но гораздо лучше когда оно в одном месте чётко описано.

У меня именно средства Ц. В том смысле что исходник-то на C описывается. А hex его чем-то генерить надо и причём иметь представление об адресации eeprom, размерах sizeof(), выравнивании -- откуда ты это узнаешь? Тут компилятор об этом всё-таки заботится.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required