Перейти к содержанию
    

перегрузка вектора прерывания в IAR

IAR Embedded Workbench IDE
5.3.4.831 (5.3.4.831)

При попытке определить вектор прерывания 

 #pragma vector=0x10
__interrupt void handler_10(void)
{
  ...
}

Error[e115]: Definition of "??handler_10 (@ 0x10)" in module main is not compatible with definition of "??handler_10" in module ?CSTARTUP2 
Из чего следует, что проблема в определении этого прерывания в СLIB.

Если убрать использование CLIB - нет возможности отладки. BreakPoint не устанавливается, стек не контролируется, но код компилируется.

Вопрос: Можно ли перегрузить вектор назначенный CLIB на свой, чтобы не потерять возможность полноценной отладки?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, visht сказал:

IAR Embedded Workbench IDE
5.3.4.831 (5.3.4.831)

Телепаты-угадыватели ядра - в отпуске.

Я вангую - MSP430, но я ещё только учусь на телепата.  :wizard:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, jcxz said:

Телепаты-угадыватели ядра - в отпуске.

Я вангую - MSP430, но я ещё только учусь на телепата.  :wizard:

просто не хочу пугать, IAR штука кросс платформенная, а увидев буквы которые не всем телепатам знакомы они могут и мимо проскочить. MRKII.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, visht сказал:

просто не хочу пугать, IAR штука кросс платформенная, а увидев буквы которые не всем телепатам знакомы они могут и мимо проскочить. MRKII.

Кроссплатформенная?? хммм... :umnik2:  Ну что-ж - тогда берите IAR 7.80.4 и компилите им. Он никаких CLIB для установки бряков не требует. Да и "__interrupt" и "#pragma vector" - тоже не требует, всё будет работать.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jcxz said:

Кроссплатформенная?? хммм... :umnik2:  Ну что-ж - тогда берите IAR 7.80.4 и компилите им. Он никаких CLIB для установки бряков не требует. Да и "__interrupt" и "#pragma vector" - тоже не требует, всё будет работать.  :biggrin:

так не компилит зараза ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, visht сказал:

просто не хочу пугать, IAR штука кросс платформенная, а увидев буквы которые не всем телепатам знакомы они могут и мимо проскочить.

Ну так и дальше будете скрывать тип ядра, или расколитесь? :dirol:
Мне точно лень прикидываться Холмсом, придется мимо проскочить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, visht сказал:

Error[e115]: Definition of "??handler_10 (@ 0x10)" in module main is not compatible with definition of "??handler_10" in module ?CSTARTUP2 

Из чего следует, что проблема в определении этого прерывания в СLIB.

 

Из сообщения об ошибке следует не вина библиотеки CLIB, а вина стартап-кода.

Например, здесь: C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\src\lib\arm\cstartup.s

Посмотрите что у вас написано в cstartup.s, возможно, что там интеррапт этого вектора там уже задействован. И вообще стартап-код можно писать свой, редактируя фабричный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Xenia сказал:

Посмотрите что у вас написано в cstartup.s, возможно, что там интеррапт этого вектора там уже задействован. 

Он там и должен быть задействован в виде week заглушки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, heavyC1oud сказал:

Он там и должен быть задействован в виде week заглушки

 

week-заглушки не должны препятствовать переопределению вектора, а вот если служебное слово "week" там пропущено, но возникнет конфликт.

 

И вообще, что это за вектор?

vector=0x10

Может быть его вообще переопределять нельзя?

 

Есть еще и такая гипотеза, что нельзя задавать вектор цифрой (0x10). Ныне на компиляторе ARM так делать можно, однако у топикстартера старая версия

IAR Embedded Workbench for MRK-II V1.32

где символы следовало брать из "I/O header file". Так оно и в тамошнем руководстве описано:
 

Цитата

 

To define an interrupt function, the __interrupt keyword and the #pragma vector directive can be used. For example:

 

#pragma vector=IVEC_TIMER0 //Symbol defined in I/O header file
__interrupt void my_interrupt_routine(void)
{
/* Do something */
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Baser said:

Ну так и дальше будете скрывать тип ядра, или расколитесь? :dirol:
Мне точно лень прикидываться Холмсом, придется мимо проскочить...

так написал же ... Уотсон:) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Xenia said:

 

week-заглушки не должны препятствовать переопределению вектора, а вот если служебное слово "week" там пропущено, но возникнет конфликт.

И вообще, что это за вектор?

vector=0x10

Может быть его вообще переопределять нельзя?

Есть еще и такая гипотеза, что нельзя задавать вектор цифрой (0x10). Ныне на компиляторе ARM так делать можно, однако у топикстартера старая версия

IAR Embedded Workbench for MRK-II V1.31

где символы следовало брать из "I/O header file". Так оно и в тамошнем руководстве описано:
 

 

Вот, это уже пинок в правильном направлении, и названия ядра не потребовалось.

про week поиском в документации *.chm*.pdf файлах не обнаружил, нужен еще один пинок.

Quote

...

        PUBLIC  __transponder_start
        PUBLIC  ??handler_10
        EXTERN  ??cmain_transponder

??handler_10:
__transponder_start:
        JMP     ??cmain_transponder

        END

0x10 указал для понимания кода, чтобы не писать название определенное в io файлах как 0x10

Да, версия старая, наверное, но самая новая из тех что на ftp, и если развивать дедуктивный метод вы можете иметь к этому отношение...

Если есть что то новее, с удовольствием воспользовался бы...

Попробую переписать, и отпишу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак в документации имеем:

Quote

STARTUP CODE
The segments  RESET and  RESET2 contain code used during system setup ( cstartup ).
Code for runtime initialization ( cmain ) and system termination ( cexit ) is placed in the CODE segment. The system setup code should be placed at the location where the microcontroller starts executing code after a reset. For the MRK-II microcontroller, this is at address  0x0 for the  RESET segment and is device-dependent for the  RESET2 segment.
In the default linker command file, the following lines will place the  RESET segment at address  0x0 and the  RESET2 segment at address  0x10 :
-Z(CODE)RESET=0000-0001
-Z(CODE)RESET2=0010-0011

cstartup:

        MODULE  ?CSTARTUP
        RSEG    RESET:CODE:NOROOT(1)
        PUBLIC  __program_start
        EXTERN  ??cmain
__program_start:
        JMP     ??cmain
        ENDMOD
        MODULE  ?CSTARTUP2
        RSEG    RESET2:CODE:NOROOT(1)
        PUBLIC  __transponder_start
        PUBLIC  ??handler_10
        EXTERN  ??cmain_transponder
??handler_10:
__transponder_start:
        JMP     ??cmain_transponder
        END

Казалось бы перегружаем функцию main_transponder и все. наличие ??handler_10 вообще непонятно, видимо метка для все той же CLIB.

Даже если ??handler_10 убрать, он все равно есть, ошибка все та же.

Quote

Error[e115]: Definition of "??handler_10 (@ 0x10)" in module main is not compatible with definition of "??handler_10" in module ?CSTARTUP2 
 

перегрузка main_transponder результата так же не дает.

листинг в области векторов остается неизменным.

Spoiler

__program_start:
    000000   800E    JMP      ??cmain
??handler_02:
    000002   8011    JMP      __unhandled_interrupt
??handler_04:
    000004   8011    JMP      __unhandled_interrupt
??handler_06:
    000006   8011    JMP      __unhandled_interrupt
??handler_08:
    000008   8011    JMP      __unhandled_interrupt
??handler_0A:
    00000A   8011    JMP      __unhandled_interrupt
??handler_0C:
    00000C   8011    JMP      __unhandled_interrupt
??handler_0E:
    00000E   8011    JMP      __unhandled_interrupt
    000010   F5F5    TRAP     
??handler_12:
    000012   8011    JMP      __unhandled_interrupt
??handler_14:
    000014   8011    JMP      __unhandled_interrupt
  WTCON = 0; // 500 ms
main:
    000016   FC1B    CLR      WTCON
    WTCON_bit.WCLR = 1;
    000018   C41B    SETB     WTCON.0
    00001A   800C    JMP      0x18
??cmain:
    00001C   7800    MOV      R0,#0x00
    00001E   7093    MOV      SP,R0
    000020   800B    JMP      main
  __disable_interrupt();
__unhandled_interrupt:
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, visht сказал:

про week поиском в документации *.chm*.pdf файлах не обнаружил,

Это результат безграмотности, которую так любят оправдывать в интернете. Ищите weak, а пользователю heavyC1oud можете в личке высказать отдельную благодарность за потраченное впустутю время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так получше

Quote

All symbols involved the  PUBWEAK / PUBLIC resolution must be placed in segments using either the  RSEG or the  ASEGN directive.

однако замена PUBLIC на PUBWEAK ничего не поменяла.

Все та же ошибка, и все так же ощущение что файл cstartup для компилятора ничего не значит.

Попробовал написать в него код - нет эффекта.

Написал в нем абракадабру - нет эффекта.

подключил cstartup к проекту, и ... то же самое.

И что я не так делаю ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...