|
Не могу включить оптимизацию, иниализировать переменные |
|
|
|
Dec 19 2008, 22:01
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
Иар 2.10 для Hitachi H8S. проц 36049.
проект дорос до максимального размера флеш 92к. при включении оптимазации по размеру Low - работает, а при медиум и high размер получившегося кода становиться меньше 1кб. походже только стартап остаеться. можно как-то побороться с этим?
модель памяти huge, если включить small, то код уменьшаеться до 80 кб, но тогда не получаеться нормально работать с указателями на константы, может быть в этом случае можно хитрость какую применить?
|
|
|
|
|
Dec 20 2008, 16:57
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
IAR 2.10 проц Hitachi H8. модель памяти HUGE. Потребовалось перенести код программы по адресу 0x6200, с нуля лежит загрузчик. Не происходит инициализация переменных. прописал -P(CONST)DATA32_ID=6200-1FFFF
Подскажите плиз в чем может быть трабл.
|
|
|
|
|
Dec 20 2008, 19:10
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
модератор собрал два мои сообщения в одну тему, но прошу заметить, что проекты разные и общее в двух вопросах только компилятор.
|
|
|
|
|
Dec 22 2008, 06:46
|

Частый гость
 
Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491

|
Цитата(yuragv @ Dec 20 2008, 01:01)  Иар 2.10 для Hitachi H8S. проц 36049.
проект дорос до максимального размера флеш 92к. при включении оптимазации по размеру Low - работает, а при медиум и high размер получившегося кода становиться меньше 1кб. походже только стартап остаеться. можно как-то побороться с этим? надо бы для начала хотя бы листинг линкера увидеть Цитата модель памяти huge, если включить small, то код уменьшаеться до 80 кб, но тогда не получаеться нормально работать с указателями на константы, может быть в этом случае можно хитрость какую применить? попробуйте описать указатель как __far
|
|
|
|
|
Dec 22 2008, 20:44
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
ссылка на листинг http://upload.com.ua/get/900612670/__far в данном компиляторе отсутствует, есть __data32. в принципе помогает, но не всегда. смотрите что происходит. есть константный массив шрифтов, есть функция рисующая символ из этого массива PrintChar(char Sym) и есть функция выводящая строку символов PrintStr(char* Str), с помощью пред. функции. так вот. при выводе строки текста при помощи PrintStr из разных мест программы в некотрых случаях строка текста отображаеться нормально, а некоторых ЧАСТЬ символов отображаеться мусором. то есть если б неправильно передавался указател на строку в ф-ции PrintStr то неправильно б отображалась вся строка.
|
|
|
|
|
Dec 22 2008, 22:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(yuragv @ Dec 20 2008, 18:57)  Не происходит инициализация переменных. прописал -P(CONST)DATA32_ID=6200-1FFFF Подскажите плиз в чем может быть трабл. Чего-то не качается ваш map. С Н8 не работал, но в иаре для других платформ адреса инициализации указаны в сегменте INITTAB. В вашем скрипте линкера с телесистем этот сегмент не упомянут. На этом форуме вы скрипт вообще не показали. Если и там не полный скрипт - то не совсем понятно, на какую помощь вы рассчитываете. Телепатировать очень трудно, поэтому, если вам не сложно, выложите (можно тут же) минимальный проект, в котором эффект повторяется. Как я понимаю, это должно быть что-то вроде Код int a = 1, b = 2; int main() { b = a; return 0; } Цитата(yuragv @ Dec 22 2008, 22:44)  то есть если б неправильно передавался указател на строку в ф-ции PrintStr то неправильно б отображалась вся строка. Больше похоже на порчу регистров или локальных переменных на стеке прерыванием. Ассемблерного обработчика прерывания в программе нет случайно?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 23 2008, 09:15
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
xcl-файл полностью
-ch8 -P(CONST)INTVEC=0-3FF -P(CONST)FLIST=40-FF -P(CODE)CODE24=6200-1FFFF -P(CONST)DATA32_ID=6200-1FFFF -Z(CONST)DIFUNCT= -P(CONST)DATA32_C= -Z(CONST)CHECKSUM=6200-1FFFF -Z(DATA)DATA32_I,DATA32_Z,DATA32_N=FFF400-FFFBFF -Z(DATA)DATA32_HEAP+_DATA32_HEAP_SIZE= -Z(DATA)CSTACK+_CSTACK_SIZE#FFF400-FFFBFF
в описании к нему сказано: /* DATA32_ID -- Initialization data for DATA32_I */ я добавил INITTAB -P(CONST)INITTAB, DATA32_ID=6200-1FFFF но это не помогло.
отладчика нет у меня, поэтому мин. проект будет все равно великовал. отладочную инфу я через уарт выводил.
что каксаеться втрого проекта. прерываний в асме нет. функции дисплея некоторые в асме. попробую убрать их пока.
|
|
|
|
|
Dec 25 2008, 12:32
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
вопрос с оптимизацией решен.
осталось только разобраться с инициализацией переменных
|
|
|
|
|
Dec 25 2008, 14:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(yuragv @ Dec 23 2008, 11:15)  отладчика нет у меня, поэтому мин. проект будет все равно великовал. отладочную инфу я через уарт выводил. Проект с одним-единственным исходным файлом с текстом из сообщения №6 занимает много места? Для его проверки отладчик не нужен - достаточно встроенного в IAR симулятора. Цитата(yuragv @ Dec 23 2008, 11:15)  функции дисплея некоторые в асме. попробую убрать их пока. Вы соблюдаете правила совместного использования С и асм? Возможно вы иногда портите какой-либо из регистров, который должны были бы сохранить при входе в функцию и восстановить при выходе. Цитата(yuragv @ Dec 25 2008, 14:32)  вопрос с оптимизацией решен. Обычно принято сообщать, в чем была ошибка, чтобы наступившие на эти же грабли нашли здесь не только уверенность, что они не одиноки, но и решение. Цитата(yuragv @ Dec 25 2008, 14:32)  осталось только разобраться с инициализацией переменных Родилось предположение - а вы случайно не используете самописный стартап? В таком случае вы должны из него вызывать библиотечные функции инициализации данных или писать свои аналоги.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 28 2008, 15:50
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
Спасибо большое за ответы. Я прошу прощения за сумбурность и невнятность.
С оптимизацией не удалось разобраться, просто я перевел память данных в модель small и программа уменьшилась процентов на 10%. А память портилась из-за неправильной очистки ее же, которая осталась от проекта в старом железе и не была вовремя замечена. К оптимизации еще придеться вернуться.
По поводу инициализация, я кажеться понял в чем дело. Поскольку в устройстве имеется сторониий загрузчик, необходимое условие - программа должна располагаться с адреса 0x6000. Таблица векторов в загрузчике перенаправляет прерывание на адрес 0x6000+addr_vector. я соответственно прописал свои переходы на функции прерываний. по адресу 0x6000 я поставил jmp main. то есть в стартап у меня не попадает программа при старте. как сделать чтобы программа стартовала в стартап?
нашел. стартую в __program_start. все инициализируется.
Сообщение отредактировал yuragv - Dec 28 2008, 15:52
|
|
|
|
|
Dec 28 2008, 19:24
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
org 6000H jmp @__program_start ; прерывание TPU0 - системный таймер org 6080H jmp @InterruptSysTimer ; прерывание TPU3 - uart2 org 60C0H jmp @IntUart2Function
зря модератор свел две темы в одну.
про оптимизацию это один проект, а про инициализацию - другой(там где программу перенести потребовалось по адресу 0x6000)
кстати все равно локальные переменные внутри ф-ции не инициализируються
Сообщение отредактировал yuragv - Dec 28 2008, 19:26
|
|
|
|
|
Dec 28 2008, 19:45
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(yuragv @ Dec 28 2008, 21:24)  org 6000H jmp @__program_start А перед этим стоит ASEG:ROOT? P.S. И используйте кнопку '#' на форме ввода для оформления исходников. Цитата(yuragv @ Dec 28 2008, 21:24)  кстати все равно локальные переменные внутри ф-ции не инициализируються Приводите пример кода. Инициализация локальных переменных никак не связана со стартапом. Или вы имеете ввиду, что не обнуляются неинициализированные локальные переменные? Так они и не должны, их надо инициализировать явно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 28 2008, 20:01
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 19-12-08
Пользователь №: 42 616

|
может подскажите еще такую вещь:
процессор 16-ти битный.
пример:
byte TmpBuf[1000]; byte Board;
*((dword *)(TmpBuf+10))=0x06000100;
в данном случае дает правильный результат.
если поменять местами byte TmpBuf[1000] и byte Board;
то в итоге TmpBuf будет заполнен так 00,01,00,00 то есть 0x06 выйдет за границу массива.
как сделать так чтобы TmpBuf всегда лежал по четному адресу?
|
|
|
|
|
Dec 28 2008, 20:16
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
Цитата(yuragv @ Dec 28 2008, 22:01)  как сделать так чтобы TmpBuf всегда лежал по четному адресу? Для IAR: Код #pragma data_alignment = 2
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|