kons 0 15 июля, 2011 Опубликовано 15 июля, 2011 · Жалоба Здравствуйте. Впервые сделал проект на 55 процессоре. Система простая: программа загружается из внешней флешовки встроеннным в проц бутлоадером, и дальше работает из ОЗУ. Дошло дело до пуска, и вылез вопрос - как выставить нужную конфигурацию возврата (fast == use RETA)? - Бутлоадер по описанию использует конфигурацию с медленным возвратом. - Компилятор генерит код под быстрый возврат, и это правильно. - Конфигурация задается в ресетном векторе, дефолтовая таблица векторов - у бутлоадера в ROM. - Бутлоадер передаст управление куда ему скажут, но конфигурацию-то поменять уже, вроде как, нельзя? Если перегрузить IVPD указателем на свою таблицу с правильным вектором и повторить ресет, то в IVPD при этом опять запишутся дефолтовые FFFF, и пустится опять бутлоадер? А если выполнить TRAP #0/INTR #0, то переключится ли конфигурация? Понимаю, что все элементарно, но как? Заранее благодарен за ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kons 0 18 июля, 2011 Опубликовано 18 июля, 2011 · Жалоба Да...видимо, техасовский 55 процессор - штука редкостная, про которую никто ничего не слышал... А между тем еще вопросик появился. hex55 упорно не желает видеть и грузить в .bss секцию .cinit. Линькуется все, естественно, с опцией -cr (инициализация переменных на этапе загрузки). Если линьковать с опцией -c (инициализация в рантайме), то памяти не хватит. Да и не солидно как-то - инициализизировать RAM из RAM... Может, кто-нибудь посоветует варианты? Заранее благодарен. P.S. Документация TI и CCS - песня та еще. Насколько же у всяких ADов, Атмелов, Кейлов и Иаров все человечнее! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 июля, 2011 Опубликовано 18 июля, 2011 (изменено) · Жалоба Да...видимо, техасовский 55 процессор - штука редкостная, про которую никто ничего не слышал... А между тем еще вопросик появился. hex55 упорно не желает видеть и грузить в .bss секцию .cinit. Линькуется все, естественно, с опцией -cr (инициализация переменных на этапе загрузки). Если линьковать с опцией -c (инициализация в рантайме), то памяти не хватит. Да и не солидно как-то - инициализизировать RAM из RAM... Может, кто-нибудь посоветует варианты? Заранее благодарен. Вот участок makefile с ключами компиляции/линковки/hex оставшегося ещё с тех времён, когда занимался C5502 (грузилось всё с i2c-флешки): PRJ_NAME = mr04 !if $d(OPC_DEBUG) DIR_OUT = DEBUG.OUT !else DIR_OUT = RELEASE.OUT !endif DIR_CGT = $(TI_DIR)c5500\cgtools\bin DEPEND = *.h makefile DEPEND_ASM = $(DEPEND) *.inc F_CC = "$(DIR_CGT)\cl55" -b -q -s -al -as F_CC = $(F_CC) -fr $(DIR_OUT) -fs $(DIR_OUT) -ft $(DIR_OUT) F_CC = $(F_CC) -fb $(DIR_OUT) -ff $(DIR_OUT) F_CC = $(F_CC) -i"C55X_C_DIR" -i$(DIR_OUT) F_CC = $(F_CC) -d"_DEBUG" -d"CHIP_5502" F_CC = $(F_CC) -mb -ms -v5502 -o1 -oi0 -pdel10 -pdsr69 -pdsr172 $(TAIL_C) F_LNK = -z -abs -c -b -w -ec_int00 F_LNK = $(F_LNK) -m$(DIR_OUT)/$(PRJ_NAME).map F_LNK = $(F_LNK) -o$(DIR_OUT)/$(PRJ_NAME).out F_LNK = $(F_LNK) -x -i"C55X_C_DIR" -l"rts.lib" #F_LNK = $(F_LNK) -xml_link_info=$(DIR_OUT)/$(PRJ_NAME).plc F_HEX = -q -i -memwidth 8 -boot ... Обратите внимание на опции -mb, -mc в ключах компилятора и опцию -c - в ключах линковщика. Инитилось всё загрузчиком. Все константы в исходниках должны быть с const. P.S. Документация TI и CCS - песня та еще. Насколько же у всяких ADов, Атмелов, Кейлов и Иаров все человечнее! а то! ;) Изменено 18 июля, 2011 пользователем jcxz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kons 0 18 июля, 2011 Опубликовано 18 июля, 2011 · Жалоба Спасибо огромное. Завтра с утра на работе буду тщательно изучать детали вашего файла - у меня все там. Наверняка, что-нибудь полезное выцеплю. Но, на память, линьковка у вас с "-c" - значит, .cinit грузится в процессор, и в рантайме инициализирует переменные в .bss. Т.е. ОЗУ расходуется дважды. У меня, увы, с RAM напряги, а инициализаций много. С константами ясно - они пишутся в другую секцию (вроде, .data), которая грузится абсолютно нормально - также, как и код (.text) программы. Офигеваю над Техасом: по опыту с ADSP самое элементарное дело - загрузить из флешки память программ и данных. А тут такой гемор, будто я хочу странного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 июля, 2011 Опубликовано 18 июля, 2011 (изменено) · Жалоба Так вроде всё правильно делается - инициализацией переменных занимается не загрузчик, а startup си-программы. А загрузчик только грузит все секции в RAM, а потом запускается startup, который не зависит от того, откуда грузится прога, поэтому сам ничего из флешки грузить не может. У меня была такая же проблема с нехваткой ОЗУ и я перепробовал все ключи компилятора и компоновщика и эти - оптимальные. Сэкономить место можете только Вы сами, например - можно скомпоновать секции .cinit и какие-то части .bss (или своего сегмента неинициализированной памяти) на одни и те же адреса. Ведь, как правило, суммарный размер секций .bss в программе много больше чем .cinit. Изменено 18 июля, 2011 пользователем jcxz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kons 0 18 июля, 2011 Опубликовано 18 июля, 2011 · Жалоба Опция "-cr" вместо "-с" позволяет не пускать инициализацию из startup. Линькер, вроде, честно ее отрабатывает. И загрузчик в ROM на кристалле грузит как память программ так и данных - ему вообще пофиг, что грузить. Но между ними - hex55, от которого я не могу добиться толку. Уже дошел до мысли состряпать собственный вариант hex55 - формат выходного файла линькера в документации вроде расписан, таблиц cinit и загрузочных тоже. Глупо, конечно, велосипед изобретать, а что делать? Хотя, как вариант развития вашей идеи, на месте cinit можно потом heap разместить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 18 июля, 2011 Опубликовано 18 июля, 2011 · Жалоба Конечно, я так и делал. И инициализированных (не нулями) переменных старался делать минимум. Еще, для уменьшения размера, перекомпилил rts55.lib, выбросив оттуда все ненужные функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kons 0 18 июля, 2011 Опубликовано 18 июля, 2011 · Жалоба ...Еще, для уменьшения размера, перекомпилил rts55.lib, выбросив оттуда все ненужные функции. Однако. Неужели линькер сам этого не делает? Завтра гляну. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться