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

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


Участник
*

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



Код
void FuncTest(void)
{
   byte buf[]="test";
  
   if(buf[0]=='t') {  
       // эта часть кода не выполняеться
   }
}


Сообщение отредактировал yuragv - Dec 28 2008, 20:56
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 29 2008, 06:08
Сообщение #17


Гуру
******

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



А что показывает листинг?


--------------------
На любой вопрос даю любой ответ
"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
sergeeff
сообщение Dec 29 2008, 10:57
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Сегмент данных лежит там, где ожидается?
Go to the top of the page
 
+Quote Post
yuragv
сообщение Jan 4 2009, 13:50
Сообщение #19


Участник
*

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



нашел я где собачка порылась.


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


Решение проблемы :
Поставил в опциях Library Calls -> Direct



P.S. однако рано радовался.
функция atoi не хочет отказываться от вызовов
через таблицу векторов.
как быть?

Сообщение отредактировал yuragv - Jan 4 2009, 14:26
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 4 2009, 16:32
Сообщение #20


Гуру
******

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



Цитата(yuragv @ Jan 4 2009, 15:50) *
функция atoi не хочет отказываться от вызовов
через таблицу векторов.
как быть?
Функция уже скомпилирована в библиотеку, значит надо подключить другой вариант библиотеки (если таковой имеется) или обеспечить работоспособность вызовов через векторы. Не знаком с архитектурой H8S, не могли бы вы кратенько изложить ее особенности, как физически реализуются вызовы через таблицу векторов и для чего используется именно такой механизм? По аналогии с AVR и MSP430 могу предположить, что вам надо было таблицу векторов расположить в файле линкера с адреса 0x6200, а в загрузчике сделать перенаправление свободных векторов из таблицы загрузчика на таблицу приложения. Таким образом приложение будет менее всего завязано на загрузчик и переход с варианта "с загрузчиком" на вариант "без загрузчика" сведется к замене _..X_ROM_START_ с 0x6200 на 0x0000:
Код
-D_..X_ROM_START_=0x6200
/*
* The '_..X_' prefix is used by C-SPY as an indication that the label should
* not be displayed in the dissassembly window.
*/
-P(CONST)INTVEC=_..X_ROM_START_-(_..X_ROM_START_+3FF)
-P(CONST)FLIST=(_..X_ROM_START_+40)-(_..X_ROM_START_+FF)
-P(CODE)CODE24=_..X_ROM_START_-1FFFF
-P(CONST)DATA32_ID,DATA32_C=_..X_ROM_START_-1FFFF
-Z(CONST)DIFUNCT,CHECKSUM=_..X_ROM_START_-1FFFF


--------------------
На любой вопрос даю любой ответ
"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
сообщение Jan 5 2009, 10:23
Сообщение #21


Участник
*

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



в загрузчике все вектора перенаправлены на адрес 0x6000+addr_vector.
изначально я свои прерывания в программе так и прописал

Код
org 6000H
jmp @__start_program

org 6080H
jmp @int_sys_timer

и т.д.


но какие функции используються в библиотеках я не знаю. а перенести таблицу FLIST на адрес 0x6000 компилятор не дает. пишет Range Error. Да и не поможет это. Дело в том что в таблице векторов прописаны адреса. а нужна команда jmp @addr.
Поэтому пока пришлось сделать некрасиво. В готовом бинарнике внешней программой переношу таблицу векторов на адрес 0x6000, преобразовывая адрес в команду jmp @addr.


p.s. через таблицу векторов как я понимаю - более быстрый вызов фунцкии. процессор работает в расширенно режиме с 24-битной адресацией. а так короткий восьмибитный адрес получаеться.сильно честно говоря не вникал.

Сообщение отредактировал yuragv - Jan 5 2009, 10:23
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2009, 11:15
Сообщение #22


Гуру
******

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



Цитата(yuragv @ Jan 5 2009, 12:23) *
Дело в том что в таблице векторов прописаны адреса. а нужна команда jmp @addr.
Мдас... попадалово. Судя по системе команд для вызова функций по таблице используется команда jsr @@addr:8, которая требует наличия таблицы в первых 256 (512?) байтах. Поэтому не проходит перенос. Команды jmp @@addr:24 для перенаправления таблицы в системе команд нет. Остается только смотреть, есть ли в комплекте компилятора специальная версия библиотеки без использования таблицы, и если такой версии нет - пересобирать библиотеку. Ну или оставлять таблицу в нулевых адресах, не использовать ее в загрузчике и давать возможность загрузчику переписывать ее при обновлении. sad.gif Или писать в загрузчике на каждый вектор подпрограмму с использованием временного регистра и переходом по команде jsr @ERn (тогда range error при перемещении таблицы обходится опцией -Q линкера - кладем ее на 0x6200 а линкуем в 0)


--------------------
На любой вопрос даю любой ответ
"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
сообщение Jan 5 2009, 13:26
Сообщение #23


Участник
*

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



спасибо. пока оставлю так как есть. тем более что устройство поставляеться с загрузчиком и менять его никто не будет.
буду думать в процессе. проект долгоиграющий.

Сообщение отредактировал yuragv - Jan 5 2009, 13:29
Go to the top of the page
 
+Quote Post

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

 


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


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