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

 
 
> IAR 5.11, Объясните pls
Laurica
сообщение May 16 2008, 15:28
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 17-04-08
Пользователь №: 36 836



Собственно проблема такая - примеры для AT91SAM7A3 компилятся, линкуются и тп. но!, при попытке прогнать их во встроенном симуляторе Cstartup.s с первой точки (reset) улетает куда-то на адрес 6E7C0000, при попытке переписать стартап чтобы он с ресета уходил на lowlevel_init в симуляторе все ОК, однако в железе - мертвяк. все во Flash_DEBUG
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vitaliy_ARM
сообщение May 22 2008, 08:07
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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*")

Это вообще возможно или я в трех соснах блуждаю?


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2008, 08:40
Сообщение #3


Гуру
******

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


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:16
Рейтинг@Mail.ru


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