реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Не могу включить оптимизацию, иниализировать переменные
yuragv
сообщение Dec 19 2008, 22:01
Сообщение #1


Участник
*

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



Иар 2.10 для Hitachi H8S. проц 36049.

проект дорос до максимального размера флеш 92к.
при включении оптимазации по размеру Low - работает, а при медиум и high
размер получившегося кода становиться меньше 1кб. походже только стартап остаеться.
можно как-то побороться с этим?

модель памяти huge, если включить small, то код уменьшаеться до 80 кб,
но тогда не получаеться нормально работать с указателями на константы,
может быть в этом случае можно хитрость какую применить?
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 20 2008, 16:57
Сообщение #2


Участник
*

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



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


Подскажите плиз в чем может быть трабл.
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 20 2008, 19:10
Сообщение #3


Участник
*

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



модератор собрал два мои сообщения в одну тему, но прошу заметить, что проекты разные и общее в двух вопросах только компилятор.
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 22 2008, 06:46
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 22 2008, 20:44
Сообщение #5


Участник
*

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



ссылка на листинг
http://upload.com.ua/get/900612670/

__far в данном компиляторе отсутствует, есть __data32.
в принципе помогает, но не всегда.

смотрите что происходит.

есть константный массив шрифтов,
есть функция рисующая символ из этого массива PrintChar(char Sym)
и есть функция выводящая строку символов PrintStr(char* Str), с помощью пред. функции.

так вот. при выводе строки текста при помощи PrintStr из разных мест программы
в некотрых случаях строка текста отображаеться нормально, а некоторых ЧАСТЬ символов отображаеться мусором. то есть если б неправильно передавался указател на строку в ф-ции
PrintStr то неправильно б отображалась вся строка.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2008, 22:25
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 23 2008, 09:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
но это не помогло.

отладчика нет у меня, поэтому мин. проект будет все равно великовал. отладочную инфу я через уарт выводил.


что каксаеться втрого проекта. прерываний в асме нет. функции дисплея некоторые в асме. попробую убрать их пока.
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 25 2008, 12:32
Сообщение #8


Участник
*

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



вопрос с оптимизацией решен.

осталось только разобраться с инициализацией переменных
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 14:05
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 28 2008, 15:50
Сообщение #10


Участник
*

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



Спасибо большое за ответы.
Я прошу прощения за сумбурность и невнятность.

С оптимизацией не удалось разобраться, просто я перевел память данных в модель small и программа уменьшилась процентов на 10%.
А память портилась из-за неправильной очистки ее же, которая осталась от проекта в старом железе и не была вовремя замечена. К оптимизации еще придеться вернуться.

По поводу инициализация, я кажеться понял в чем дело. Поскольку в устройстве имеется сторониий загрузчик, необходимое условие - программа должна располагаться с адреса 0x6000. Таблица векторов в загрузчике перенаправляет прерывание на адрес 0x6000+addr_vector. я соответственно прописал свои переходы на функции прерываний. по адресу 0x6000 я поставил jmp main. то есть в стартап у меня не попадает программа при старте. как сделать чтобы программа стартовала в стартап?


нашел. стартую в __program_start. все инициализируется.

Сообщение отредактировал yuragv - Dec 28 2008, 15:52
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 28 2008, 18:51
Сообщение #11


Гуру
******

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



Цитата(yuragv @ Dec 28 2008, 17:50) *
я соответственно прописал свои переходы на функции прерываний.
Каким образом? Возможно именно здесь и кроется ошибка, из-за которой оптимизатор все выкидывает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 28 2008, 19:24
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 28 2008, 19:45
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
yuragv
сообщение Dec 28 2008, 20:01
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 всегда лежал по четному адресу?
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 28 2008, 20:16
Сообщение #15


читатель даташитов
****

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



Цитата(yuragv @ Dec 28 2008, 22:01) *
как сделать так чтобы TmpBuf всегда лежал по четному адресу?

Для IAR:
Код
#pragma data_alignment = 2
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 23:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.02712 секунд с 7
ELECTRONIX ©2004-2016