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

IAR for PIC18

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

 

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?

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


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

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

 

        RSEG CODE:CODE:NOROOT(1)

        PUBLIC Wr_Reg
Wr_Reg:
        nop
        nop
        ret

 

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

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


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

Делаю так:

 

  
  PUBLIC test
;FUNCTION  test, 1
  RSEG CODE:CODE

test:
  NOP
  NOP
  NOP

  return

  END

 

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

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


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

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

 

А откуда вы взяли, что там должен быть параметр? Просто "FUNCTION test" не проходит?

У меня впечатление, что FUNCTION является заменой PUBLIC. Попробуйте "FUNCTION test" раскомментировать, а PIBLIC закоментировать.

P.S. Прошу прощения, но у меня IAR компилятор для AVR, а не для PIC18, поэтому могут быть расхождения в синтакисе языка.

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


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

Без второго параметра директива 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"...

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


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

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

Привожу переписку с саппортом 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 */

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


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

...

ПМСМ, для того, чтобы таких вопросов не было, для PIC18 надо использовать MCC18.

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


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

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

Он денег стоит. И немалых.

А воровать нехорошо...

МСС18 абсолютно бесплатен. С некоторыми незначительными ограничениями.

И по последним данным не так плох, как о нем рассказывают.

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


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

Не забывайте где мы все живем :)

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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