Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: uVision: Ассемблер в Си-программе?!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
amoralex
Господа, а как вставить ассемблерный кусочек кода (обработка прерывания отпимизированная) в Си-программу?

Стандартный asm {} не срабатывает...

Документация по КейлСи в отношении ассемблера тоже путанная, я еще по крайней мере вразумительного ничего не нашел там...

Заранее спасибо.
elserge
#pragma asm
/* ASM */
#pragma endasm

но Keil из исходника с ассемблерными вставками генерит только SRC файл, который потом через ассемблер пускаешь, см. #pragma SRC

Может удобней при линковке подставлять заранее подготовленый obj-модуль обработчика прерывания, написанный на ASM.
amoralex
Спасибо!

Получилось!!! a14.gif

Но теперь симулятор отказывается работать... хм... maniac.gif
elserge
Подробнее...
amoralex
Когда запускаю симуляцию, то выплавает Окно Дизассембериванного кода и ошибка в окошке Command: acces violation at <адрес>
Miron
можно сделать и так:

делаем асм модуль в отдельном файле и включаем его в проект

;*************************************************************
;** Процедура на АСМ
;*************************************************************
NAME PR_messaging_420

PUBLIC OUT_4_20

EXTRN DATA (Buf_ADSP) ;** Внешняя переменная

PROG SEGMENT CODE ì
RSEG PROG
;***************************************************************
;***************************************************************
OUT_4_20: mov a,Buf_ADSP
....
.....

ret


в си модуле


data unsigned short Buf_ADSP; //та самая переменная что доступна в асм

extern void OUT_4_20(); //обявляем прототип функции


void main(void)
{OUT_4_20(); //вызываем
}

можно также передать и принять даные в /из асм
тогда прототип
extern char OUT_4_20(char);
в этом случае параметры будут передаваться через
регистры рабочего банка в help подробно все описани
elserge
Цитата(amoralex @ May 12 2005, 13:23)
Когда запускаю симуляцию, то выплавает Окно Дизассембериванного кода и ошибка в окошке Command: acces violation at <адрес>
*


Насколько я понял, у тебя uVision слетает, когда ты вызываешь Debug Session. Извини, в uVision совсем слаб, хотя попробуй другую версию, или может модуль симуляции (dll) от другой версии.
Stas
Если была в *.C файле *.ASM вставка, то отладка идет по *.SRC файлу, а он автоматом не открывается. Открой его через File->Open, он имеет то же название что и исходник, но с расширением .src. Там можно и смотреть какие регистры использует компилятор для передачи параметров в функции написанные на ассемблере, ставить точки остановки и т.п.
amoralex
Спасибо, буду развлекаться biggrin.gif
Yra
#pragma asm
/* ASM */
#pragma endasm

И не забыть в свойствах данного файла проставить галочки
Generate Assembler SRC file
Assembler SRC file

- вроде всё работает
Krom
Цитата(Miron @ May 12 2005, 13:35)
можно сделать и так:

делаем асм модуль в отдельном файле и включаем его в проект .....

*


Вынести подобные функции в отдельную библиотеку на ассемблере самый правильный путь - меньше будет геммороя, если вдруг понадобится переносить в другую среду разработки. Но так как это описал Miron работать (то есть компилироваться) не будет.

Как это делается, хорошо расписано в C51.pdf (в папке Keil\C51\HLP), Chapter 6. Advanced Programming Techiques -> Interfacing C Programs To Assembler.

Если в кратце, то надо сделать так:

1. Создаем ассемблерный файл приблизительно следующего содержания:

NAME ИМЯ_МОДУЛЯ

PUBLIC _Моя_Функция_С_Параметрами
;=================================================
; Прототип: uchar Моя_Функция_С_Параметрами( uchar ch );
;
; Обратите внимание на знак подчеркивания перед именем функции -
; - если функция с параметрами, то в asm он ставится
;=================================================

?PR?_Моя_Функция_С_Параметрами?ИМЯ_МОДУЛЯ SEGMENT CODE

RSEG ?PR?_Моя_Функция_С_Параметрами?ИМЯ_МОДУЛЯ

_Моя_Функция_С_Параметрами:

mov TL0,R7 ; TL0 = ch

... и так далее ...

mov R7,#возвращаемое_значение
ret


PUBLIC Моя_Функция_Без_Параметров
;=================================================
; Прототип: void Моя_Функция_Без_Параметров( void );
;
; Эта функция без параметров, поэтому знак подчеркивания перед
; не ставим
;=================================================

?PR?Моя_Функция_Без_Параметров?ИМЯ_МОДУЛЯ SEGMENT CODE

RSEG ?PR?Моя_Функция_Без_Параметров?ИМЯ_МОДУЛЯ

Моя_Функция_Без_Параметров:
push ACC

... и так далее ...

pop ACC
ret

END ;=========================================

2.
///////////////////////////////////////////////////////////////////////////////////////////
// В С-шном файле(или делаем заголовочный файл если функций несколько)
///////////////////////////////////////////////////////////////////////////////////////////

unsigned char Моя_Функция_С_Параметрами( unsigned char ch );
void Моя_Функция_Без_Параметров( void );

main()
unsigned char res;

res = Моя_Функция_С_Параметрами( 0xA0 );
Моя_Функция_Без_Параметров( );


Разумеется, нужно подключить ассемблерный файл к проекту.

Передача параметров разная в зависимости от модели памяти, типа параметров, их количества и так далее - смотрите в указанном источнике.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.