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

передача параметров из АСМ в КЕЙЛе

Глубокоуважаемый ALL!!!

Имеется текст программы на С в Кейле...

Есть фрагмент, в котором необходимо резко привязать времена...

написали кусок кода на АСМе, Вопрос, как при выходе из подпрограммы, написанной в АСМе передать данные назад в С?...

Для начала хотя бы 1 байт.

Спасибо...

 

BYTE receive_byte(void)

{

#pragma ASM

...

XRL IOE, #02H

XRL IOE, #02H

...

MOV R7, A ; Надо передать на выход это значение А

 

#pragma ENDASM

}

 

при компиляции Линкер предупреждает о том, что нет данных для возврата...

TEST1.C(410): warning C173: missing return-expression

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


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

...

TEST1.C(410): warning C173: missing return-expression

 

...оказалось, что передается как раз R7... не могу найти где это определяется, и как снять предупреждение Линкера..., хотя, программа, в общем то работает... (оказывается)

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


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

Если Вас так уж волнует предупреждение транслятора о том, что нет возврата из функции, то можно сделать одно из двух:

1) напишите всю функцию на ассемблере (не вставкой, в файле с расширением a51)

2) выделите функцию в отдельный файл и определите как возвращающую не BYTE а - void , в файле же, где будите ее (функцию) использовать - напишите честно: BYTE receive_byte(void);

 

О передаче параметров и возврате значений функций можно почитать в С51.pdf -> Chapter 3. Language Extensions -> Function Declarations

Изменено пользователем Палыч

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


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

По просьбе bialix, его форум что-то не пускает

 

http://onembedding.com/hints/hacks/asm-inline/

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


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

...

Чтобы предупреждения не было, сделайте так

...

// MOV R7, A ; Надо передать на выход это значение А // эта строка не нужна

#pragma ENDASM

return ACC;

}

 

результат будет тот-же, а предупреждения не будет.

Изменено пользователем IgorKossak
Бездумное цитирование

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


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

... return ACC;

 

результат будет тот-же, а предупреждения не будет.

 

 

О!!!, прошло без ошибок, то, что вместо А надо АСС, сожалею, не догадался...

...было бы неплохо теперь об этом почитать...

Пойду по рекомендованным ссылкам...

 

Еще раз всем спасибо... :a14:

 

ЗЫ.

Не хочу надоедать, но, есть еще несколько вопросов по организации передачи параметров АСМ <->С...

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


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

inline в Keil не работает ? как функцию сделать inline ом ?

или keil их при оптимизации сам распознаёт?

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


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

как функцию сделать inline ом ?

или keil их при оптимизации сам распознаёт?

В Keil ключевое слово inline - не поддерживается. Некое подобие inline-функции можно создать с помощью директивы препроцессора #define.

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


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

ok! А подскажите, как должны быть настроены не задействованные пины портов? чтобы потребляло меньше.

на выход в "1" как обычно?

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


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

В Keil ключевое слово inline - не поддерживается. Некое подобие inline-функции можно создать с помощью директивы препроцессора #define.

 

вообщето inline-функции это из CPP, поэтому неудивительно что Keil не поддерживает. Простое подобие inline-функций можно реализовать как макро-подстановки с помощью директивы #define.

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


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

вообщето inline-функции это из CPP, поэтому неудивительно что Keil не поддерживает.
Это - Вы погорячились. Посмотрите стандарт ISO/IEC 9899 Programming languages C. Но, Keil и не утверждает, что поддерживает этот стандарт

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


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

ok! А подскажите, как должны быть настроены не задействованные пины портов? чтобы потребляло меньше.

на выход в "1" как обычно?

В некоторых ситуациях лучше незадействованные пины переводить в 0. Сопротивление канала меньше, меньше возможности для сбоев от наводок. Была ситуация : были пины, которые проверялись только при включении прибора. Некоторые дорожки от этих пинов были длинной 2-3 см и никуда не подтянуты. Они ловили наводки и это приводило к сбою контроллера. Выход - или подтягивать внешними резисторами, или просто перевел в 0 и проблема исчезла.

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


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

Здравствуйте, ещё вопрос, в KEIL есть счётчик тактов? мне нужно расчитать время обработки прерывания.

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


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

Здравствуйте, ещё вопрос, в KEIL есть счётчик тактов? мне нужно расчитать время обработки прерывания.

Есть конечно, states называется. Если частота кварца правильно задана в target то и время можно увидеть (sec)

post-25467-1250224119_thumb.jpg

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


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

Ок! спасибо. А ещё момент, можно ли программно прочитать регистр идентификатора устройства DEVICEID??? , с помощью Jtaga он читается командой..IDCODE, у меня С8051А02x

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


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

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

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

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

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

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

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

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

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

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