Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR for PIC18
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
scout
Собственно делаю как описано в документации:

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?
Xenia
Скорее всего в ассемблерной части вы забыли объявить сегмент. Например так:

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

        PUBLIC Wr_Reg
Wr_Reg:
        nop
        nop
        ret


Как называется по умолчанию мой сегмент кода, а как называется ваш - узнаете, если взглянете на листинг C-шного кода.
scout
Делаю так:

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

test:
  NOP
  NOP
  NOP

  return

  END


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


А откуда вы взяли, что там должен быть параметр? Просто "FUNCTION test" не проходит?
У меня впечатление, что FUNCTION является заменой PUBLIC. Попробуйте "FUNCTION test" раскомментировать, а PIBLIC закоментировать.
P.S. Прошу прощения, но у меня IAR компилятор для AVR, а не для PIC18, поэтому могут быть расхождения в синтакисе языка.
scout
Без второго параметра директива 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"...
scout
Поскольку никто на мой вопрос не смог ответить, отвечу сам себе, возможно кому - то эта информация окажется полезной.
Привожу переписку с саппортом 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 */
Прохожий
Цитата(scout @ Oct 30 2009, 20:23) *
...

ПМСМ, для того, чтобы таких вопросов не было, для PIC18 надо использовать MCC18.
scout
А чем конкретно вам Иар не угодил?
Прохожий
Цитата(scout @ Oct 31 2009, 01:06) *
А чем конкретно вам Иар не угодил?

Он денег стоит. И немалых.
А воровать нехорошо...
МСС18 абсолютно бесплатен. С некоторыми незначительными ограничениями.
И по последним данным не так плох, как о нем рассказывают.
scout
Не забывайте где мы все живем smile.gif
Думаю тему можно считать закрытой, суппорты дали вполне исчерпывающий ответ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.