|
IAR 5.11, Объясните pls |
|
|
|
May 16 2008, 15:28
|
Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 836

|
Собственно проблема такая - примеры для AT91SAM7A3 компилятся, линкуются и тп. но!, при попытке прогнать их во встроенном симуляторе Cstartup.s с первой точки (reset) улетает куда-то на адрес 6E7C0000, при попытке переписать стартап чтобы он с ресета уходил на lowlevel_init в симуляторе все ОК, однако в железе - мертвяк. все во Flash_DEBUG
|
|
|
|
|
 |
Ответов
|
May 22 2008, 08:07
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Потихоньку разбираюсь с C++. Не пойму один момент. Как известно, в ARM надо прописать адрес обработчика прерывания в VIC; Некоторый класс: Код typedef class _TIMER { public: void Init(); __arm void Isr();
}TIMER,*pTIMER;
void _TIMER::Init() { ------------------- OpenIsr(TIMER1,(DWORD*)Isr,HIGH_PR); // определяем обработчик прерывания }
__arm void _TIMER::Isr() { ---------------------- } Компилятор ругается, что нельзя сконвертировать тип. Пробовал и так конвертировать: Код OpenIsr(TIMER1,static_cast<DWORD*>(Isr),HIGH_PR); // определяем обработчик прерывания Ошибка таже: Error[Pa073]: invalid type conversion (from "__code __interwork void ()" to "DWORD*") Это вообще возможно или я в трех соснах блуждаю?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
May 22 2008, 08:40
|

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

|
Цитата(Vitaliy_ARM @ May 22 2008, 11:07)  Ошибка таже: Error[Pa073]: invalid type conversion (from "__code __interwork void ()" to "DWORD*") Странная ошибка. он должен был ругаться на конвертацию адреса функции-члена в указатель, а он ругается на нее как на обычную функцию. Дело в том, что при вызове функции-члена первым параметром неявно передается указатель на объект. Прерывание не может передать этот указатель. Поэтому, или обработчик должен быть статической функцией-членом (которой не нужен this) или надо написать обычную функцию как обертку: Код __arm void TIMER1_Isr_wrapper() { TIMER1.Isr(); // Тут мы явно указываем передать адрес TIMER1 как this }
OpenIsr(TIMER1,(DWORD*)TIMER1_Isr_wrapper,HIGH_PR); // определяем обработчик прерывания при этом функцию-член-обработчик лучше сделать встраиваимой. Чтобы было легче понять: Вы объявили 5 экземпляров этого класса (TIMER1, TIMER2, ... TIMER5). Попав в ваш _TIMER::Isr(), откуда он будет знать, какой конкретно из этих 5 таймеров надо обрабатывать? И при инициализации ваш _TIMER:Init() настраивает только первый таймер, а как настраивать остальные? Если вы пишете этот класс под один конкретный таймер, то можно все функции-члены и данные-члены сделать статическими, но тогда появится неудобство - придется явно заводить каждый статический член-данное. Ой... Вы же передаете TIMER1 в OpenIsr. Видимо где-то дальше оно у вас используется для вызова обработчика. Тогда про статическое не читайте, почитайте это: указатель на функцию-член. И покажите объявление (а лучше и текст) OpenIsr()
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 22 2008, 14:29
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(Сергей Борщ @ May 22 2008, 12:40)  Ой... Вы же передаете TIMER1 в OpenIsr. Видимо где-то дальше оно у вас используется для вызова обработчика. Тогда про статическое не читайте, почитайте это: указатель на функцию-член. И покажите объявление (а лучше и текст) OpenIsr() Хорошая ссылка. Привожу код для OpenIsr(): Код void OpenIsr(DWORD IntNum,DWORD Handler, DWORD Priority) { DWORD *vect_addr; DWORD *vect_cntl; VICIntEnClr = 1 << IntNum; if (IntNum < VIC_SIZE ) { vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNum*4); vect_cntl = (DWORD *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + IntNum*4); *vect_addr = Handler; *vect_cntl = Priority; VICIntEnable = 1 << IntNum; } } Немного конкретизирую идею Думал сделать отдельный класс TARGET, в котором будут находиться функции , а потом все классы сделать наследниками его. Класс, который написал - это просто пример. Наверное удобнее номер таймера передавать в конструкторе, а потом от этого прописывать прерывания в OpenIsr: Код typedef class _TIMER { public: _TIMER(DWORD TimerNum); void Init(); void Isr(); } Собственно на пути всего этого стоит то, что не могу передать функции OpenIsr адрес обработчика превывания (метод этого же класса), который она должна записать в регистр микроконтроллера (LPC2468). По ссылке, указанной вами, попытался создать в классе такой указатель: void (_TIMER::*pFunction) (); Потом в конструкторе попытался сделать так: Код _TIMER::_TIMER(void) { DWORD *p; pFunction = &_TIMER::Isr; p = static_cast<DWORD*>(pFunction); } На третью строчку в фигурных скобках таже ошибка, не может сконвертировать тип. Обертку C функции делать не очень хочется, каждый раз при создании класса ее придется тоже создавать.
Сообщение отредактировал Vitaliy_ARM - May 22 2008, 14:35
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
Сообщений в этой теме
Laurica IAR 5.11 May 16 2008, 15:28 sKWO Цитата(Laurica @ May 16 2008, 18:28) Собс... May 17 2008, 05:41 Laurica Цитата(sKWO @ May 17 2008, 09:41) Немного... May 17 2008, 06:16 zltigo Цитата(sKWO @ May 17 2008, 07:41) И ещё, ... May 17 2008, 06:31  Laurica Цитата(zltigo @ May 17 2008, 10:31) Борит... May 17 2008, 10:53   zltigo Цитата(Laurica @ May 17 2008, 12:53) с пр... May 17 2008, 14:27    Laurica Цитата(zltigo @ May 17 2008, 18:27) C кар... May 17 2008, 17:02     zltigo Цитата(Laurica @ May 17 2008, 19:02) Зря ... May 17 2008, 17:33      Laurica Обратился к первоисточнику:
Код ARM
__vector... May 17 2008, 18:55       alexander55 Цитата(Laurica @ May 17 2008, 22:55) Кодl... May 19 2008, 05:33        Laurica Цитата(alexander55 @ May 19 2008, 09:33) ... May 19 2008, 06:14       zltigo Цитата(Laurica @ May 17 2008, 20:55) если... May 19 2008, 06:23        Laurica За пример - большое спасибо, так и вправду понятне... May 19 2008, 06:46 Vitaliy_ARM Столкнулся с такой проблемой.
Не могу в этом IAR ... May 20 2008, 09:03 Сергей Борщ Цитата(Vitaliy_ARM @ May 20 2008, 12:03) ... May 20 2008, 09:44  Vitaliy_ARM Цитата(Сергей Борщ @ May 20 2008, 13:44) ... May 20 2008, 10:01   Сергей Борщ Ах вот оно как! Я чего-то подумал, что TIMER1 ... May 22 2008, 18:18    Vitaliy_ARM Цитата(Сергей Борщ @ May 22 2008, 22:18) ... May 23 2008, 09:26     Сергей Борщ Цитата(Vitaliy_ARM @ May 23 2008, 12:26) ... May 23 2008, 11:27      Vitaliy_ARM Цитата(Сергей Борщ @ May 23 2008, 15:27) ... May 26 2008, 07:01       Сергей Борщ Цитата(Vitaliy_ARM @ May 26 2008, 10:01) ... May 26 2008, 08:45        Vitaliy_ARM Цитата(Сергей Борщ @ May 26 2008, 12:45) ... May 26 2008, 09:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|