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

 
 
> IAR for PIC18, Вызов asm routines
scout
сообщение Oct 24 2009, 21:30
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Собственно делаю как описано в документации:

PUBLIC в *.asm, extern перед объявлением прототипа в *.c.
Не работало, пока не глянул в startup и не посмотрел, что там еще
для чего то директивы FUNCTION и FUNCALL применяются.
Полез читать доку на компилер, но там все как то смутно описано,
особенно не понятно, что за таинственный параметр надо указывать
после имени метки в директиве FUNCTION.
Т.е например в startup:

Код
FUNCTION  __program_start,021A01H
LOCFRAME  CSTACK, 2, STACK
FUNCTION  __low_level_init,0200H
FUNCALL   __program_start, __low_level_init


Что за таинственный параметр 021A01H?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Xenia
сообщение Oct 24 2009, 22:54
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Скорее всего в ассемблерной части вы забыли объявить сегмент. Например так:

Код
        RSEG CODE:CODE:NOROOT(1)

        PUBLIC Wr_Reg
Wr_Reg:
        nop
        nop
        ret


Как называется по умолчанию мой сегмент кода, а как называется ваш - узнаете, если взглянете на листинг C-шного кода.
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 25 2009, 06:34
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Делаю так:

Код
  
  PUBLIC test
;FUNCTION  test, 1
  RSEG CODE:CODE

test:
  NOP
  NOP
  NOP

  return

  END


Если отремарить строчку "FUNCTION test, 1", то работает. Параметр 1 я написал от фонаря, т.к не знаю, что это такое. Собственно и хочу разобраться.


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
Xenia
сообщение Oct 25 2009, 09:02
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(scout @ Oct 25 2009, 09:34) *
Если отремарить строчку "FUNCTION test, 1", то работает. Параметр 1 я написал от фонаря, т.к не знаю, что это такое. Собственно и хочу разобраться.


А откуда вы взяли, что там должен быть параметр? Просто "FUNCTION test" не проходит?
У меня впечатление, что FUNCTION является заменой PUBLIC. Попробуйте "FUNCTION test" раскомментировать, а PIBLIC закоментировать.
P.S. Прошу прощения, но у меня IAR компилятор для AVR, а не для PIC18, поэтому могут быть расхождения в синтакисе языка.
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 25 2009, 17:24
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Без второго параметра директива FUNCTION не работает(компилятор ругается на не допустимый синтаксис). Без PUBLIC тоже не работает, но ругается уже линкер. Для AVR у меня тоже все прекрасно работает, а вот под PIC они наворотили...
Вот что сказано в документации на Си компилятор:

SYNTAX
FUNCTION label,value

PARAMETERS
label - Label to be declared as function.
value - Function information.

DESCRIPTION
FUNCTION declares the label name to be a function. value encodes extra information
about the function.

И все... Какую такую дополнительную информацию отражает параметр "value"...


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 30 2009, 17:23
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Поскольку никто на мой вопрос не смог ответить, отвечу сам себе, возможно кому - то эта информация окажется полезной.
Привожу переписку с саппортом IAR-а.

The second argument to the FUNCTION directive is a field of flags. The
meaning of the different flag values are given in the table below. For
instance, a flag value containing the bit mask 0x400 indicates that the
function is called via a function pointer.

Flag value Flag description
0x001 The function is defined in this module
0x002 The function is prototyped
0x200 The function is placed in non-banked memory
0x400 The function is called indirectly

Example:
1) Create a source code in C e.g
void foo(int i, int j)
{
i++;
j++;
}
Compiling this code you generate a assembler file using
Project->options->C/C++ compiler>List checking "output assembler file"

you get file .s49 file containing

...
EXTERN ?CLPIC18_3_10_L00

PUBLIC foo
FUNCTION foo,0203H
ARGFRAME OVERLAY, 4, STATIC
LOCFRAME CSTACK, 2, STACK

...

The value 0203H are the bits telling to the linker the properties of the
function.

Я попросил саппорта дать более подробное описание флагов, на что получил следующее:

Some of the less esoteric bits and brief comments are listed below.

Making "OR" with some of the below values (properties) you will get the
resulting "021A01H"

0x0001L /* Function is defined (body found) */
0x0002L /* ANSI prototyped */
0x0004L /* "trap" function */
0x0008L /* "monitor" function */
0x0010L /* "interrupt" function */
0x0020L /* "interrupt" [vec] function */
0x0200L /* "non_banked" function */
0x0400L /* function is indirectly referred to */

0x0800L /* This is "main()" */
0x1000L /* Function calls other */
0x10000L /* Intrinsic function */
0x20000L /* calls directly */
0x40000L /* calls indirectly */
0x80000L /* Inline asm directive used */


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Oct 30 2009, 18:53
Сообщение #7


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(scout @ Oct 30 2009, 20:23) *
...

ПМСМ, для того, чтобы таких вопросов не было, для PIC18 надо использовать MCC18.
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 30 2009, 22:06
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



А чем конкретно вам Иар не угодил?


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post
Прохожий
сообщение Oct 30 2009, 23:50
Сообщение #9


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(scout @ Oct 31 2009, 01:06) *
А чем конкретно вам Иар не угодил?

Он денег стоит. И немалых.
А воровать нехорошо...
МСС18 абсолютно бесплатен. С некоторыми незначительными ограничениями.
И по последним данным не так плох, как о нем рассказывают.
Go to the top of the page
 
+Quote Post
scout
сообщение Oct 31 2009, 08:37
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 4-01-06
Из: Москва
Пользователь №: 12 837



Не забывайте где мы все живем smile.gif
Думаю тему можно считать закрытой, суппорты дали вполне исчерпывающий ответ.


--------------------
То, что неясно, следует выяснить. То, что трудно творить, следует делать с великой настойчивостью.
Конфуций
Go to the top of the page
 
+Quote Post

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

 


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


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