Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: передача параметров из АСМ в КЕЙЛе
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
nicom
Глубокоуважаемый 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
nicom
Цитата
...
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
spf
По просьбе bialix, его форум что-то не пускает

http://onembedding.com/hints/hacks/asm-inline/
DimG
Цитата(nicom @ Jan 18 2007, 17:41) *
...

Чтобы предупреждения не было, сделайте так
...
// MOV R7, A ; Надо передать на выход это значение А // эта строка не нужна
#pragma ENDASM
return ACC;
}

результат будет тот-же, а предупреждения не будет.
nicom
Цитата(DimG @ Jan 19 2007, 05:50) *
... return ACC;

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



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

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

ЗЫ.
Не хочу надоедать, но, есть еще несколько вопросов по организации передачи параметров АСМ <->С...
Terrabyte
inline в Keil не работает ? как функцию сделать inline ом ?
или keil их при оптимизации сам распознаёт?
Палыч
Цитата(Terrabyte @ Aug 6 2009, 15:21) *
как функцию сделать inline ом ?
или keil их при оптимизации сам распознаёт?
В Keil ключевое слово inline - не поддерживается. Некое подобие inline-функции можно создать с помощью директивы препроцессора #define.
Terrabyte
ok! А подскажите, как должны быть настроены не задействованные пины портов? чтобы потребляло меньше.
на выход в "1" как обычно?
tag
Цитата(Палыч @ Aug 6 2009, 15:54) *
В Keil ключевое слово inline - не поддерживается. Некое подобие inline-функции можно создать с помощью директивы препроцессора #define.


вообщето inline-функции это из CPP, поэтому неудивительно что Keil не поддерживает. Простое подобие inline-функций можно реализовать как макро-подстановки с помощью директивы #define.
Палыч
Цитата(tag @ Aug 7 2009, 10:03) *
вообщето inline-функции это из CPP, поэтому неудивительно что Keil не поддерживает.
Это - Вы погорячились. Посмотрите стандарт ISO/IEC 9899 Programming languages C. Но, Keil и не утверждает, что поддерживает этот стандарт
barabek
Цитата(Terrabyte @ Aug 7 2009, 16:50) *
ok! А подскажите, как должны быть настроены не задействованные пины портов? чтобы потребляло меньше.
на выход в "1" как обычно?

В некоторых ситуациях лучше незадействованные пины переводить в 0. Сопротивление канала меньше, меньше возможности для сбоев от наводок. Была ситуация : были пины, которые проверялись только при включении прибора. Некоторые дорожки от этих пинов были длинной 2-3 см и никуда не подтянуты. Они ловили наводки и это приводило к сбою контроллера. Выход - или подтягивать внешними резисторами, или просто перевел в 0 и проблема исчезла.
Terrabyte
Здравствуйте, ещё вопрос, в KEIL есть счётчик тактов? мне нужно расчитать время обработки прерывания.
Omen_13
Цитата(Terrabyte @ Aug 12 2009, 11:44) *
Здравствуйте, ещё вопрос, в KEIL есть счётчик тактов? мне нужно расчитать время обработки прерывания.

Есть конечно, states называется. Если частота кварца правильно задана в target то и время можно увидеть (sec)
Terrabyte
Ок! спасибо. А ещё момент, можно ли программно прочитать регистр идентификатора устройства DEVICEID??? , с помощью Jtaga он читается командой..IDCODE, у меня С8051А02x
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.