Jump to content

    
Sign in to follow this  
visht

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

Recommended Posts

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 на свой, чтобы не потерять возможность полноценной отладки?

Спасибо.

Share this post


Link to post
Share on other sites
1 час назад, visht сказал:

IAR Embedded Workbench IDE
5.3.4.831 (5.3.4.831)

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

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

Share this post


Link to post
Share on other sites
44 minutes ago, jcxz said:

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

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

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

Share this post


Link to post
Share on other sites
7 минут назад, visht сказал:

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

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

Share this post


Link to post
Share on other sites
2 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
2 часа назад, visht сказал:

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

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

Share this post


Link to post
Share on other sites
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, возможно, что там интеррапт этого вектора там уже задействован. И вообще стартап-код можно писать свой, редактируя фабричный.

Share this post


Link to post
Share on other sites
2 часа назад, Xenia сказал:

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

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

Share this post


Link to post
Share on other sites
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 */
}

 

 

Share this post


Link to post
Share on other sites
11 hours ago, Baser said:

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

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

Share this post


Link to post
Share on other sites
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, и если развивать дедуктивный метод вы можете иметь к этому отношение...

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

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

Share this post


Link to post
Share on other sites

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

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:
 

 

Share this post


Link to post
Share on other sites
1 час назад, visht сказал:

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

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

Share this post


Link to post
Share on other sites

так получше

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 к проекту, и ... то же самое.

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

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this