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

C-код Со Вставкой Ассемблера


uuu2

Рекомендуемые сообщения

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

Конкретная задача такая: должен быть основной код на С, а в boot-секторе будет ассемблерный загрузчик (для самопрограммирования). Плюс (возможно) ещё несколько ассемблерных процедур. Программирую в WinAVR (gcc 4.3.2).

Т.е. сишный код должен быть по адресу 0x000, а ассмеблерный - по адресу BOOTSTART:

.equ PAGESIZEB = PAGESIZE*2; установка пост.значения
.org BOOTSTART; адрес boot-сектора

Write_page:

ldi spmcrval, (1<<PGERS) | (1<<SPMEN); page erase; константу в регистр
call Do_spm 
ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); re-enable the RWW section; константу в регистр
call Do_spm
; transfer data from RAM to Flash page buffer
ldi looplo, low(PAGESIZEB);init loop variable
ldi loophi, high(PAGESIZEB);not required for PAGESIZEB<=256

Wrloop:

ld r0, Y+
ld r1, Y+
ldi spmcrval, (1<<SPMEN); константу в регистр
call Do_spm
adiw ZH:ZL, 2;Сложить константу и слово Rdh:Rdl = Rdh:Rdl + K6  
sbiw loophi:looplo, 2;use subi for PAGESIZEB<=256;sbiw - Вычесть конст. из слова Rdh:Rdl = Rdh:Rdl - K6 
brne Wrloop;Перейти если не равно if(Z==0) PC = PC + k + 1 

; execute page write
subi ZL, low(PAGESIZEB);restore pointer; Вычитание константы Rd = Rd - K8 
sbci ZH, high(PAGESIZEB);not req for PAGESIZEB<=256; Вычитание константы с переносом Rd = Rd - K8 - C 
ldi spmcrval, (1<<PGWRT) | (1<<SPMEN); константу в регистр
call Do_spm
; re-enable the RWW section
ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); константу в регистр
call Do_spm

Return:

in temp1, SPMCR
sbrs temp1, RWWSB; If RWWSB is set, the RWW section is not ready yet
			  ; Пропустить если бит в регистре установлен
ret
; re-enable the RWW section
ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN); константу в регистр
call Do_spm
rjmp Return

Do_spm:

; check for previous SPM complete
Wait_spm:

in temp1, SPMCR; Чтение порта
sbrc temp1, SPMEN; Пропустить если бит в регистре очищен
rjmp Wait_spm
; input: spmcrval determines SPM action disable interrupts if enabled, store status
in temp2, SREG; Чтение порта
cli;Очистить флаг прерываний
; check that no EEPROM write access is present

Wait_ee:

sbic EECR, EEWE; Пропустить если бит в порту очищен
rjmp Wait_ee
; SPM timed sequence
out SPMCR, spmcrval;Запись в порт
spm
; restore SREG (to enable interrupts if originally enabled)
out SREG, temp2
ret

Я ещё пробовал сделать весь проект на ASM (File->New->Avr assembler), но gcc ругается на какой-то elf-файл ("no rule to make target test.elf").

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вам надо сделать сначала только загрузчик. А потом уже им загрузить програму. Асемблер - Вас интерересует только несколько команд или целая функция? С командами там всё просто. для функций читайте МАНУАЛ

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Как юзать в ассемблерном файле ("test.s") константы? Компилятор их не видит.

Эти варианты подключения не катят:

#include <avr/io.h>

.include "avr/io.h"

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

.include "avr/io.h"

а где этот avr/io.h? скорее всего он дожен быть в папке в проектом, либо в кавычках надо полный путь к файлу указать

НА ЛЮБОЙ ЭЛЕМЕНТ НАЙДЕТСЯ МОЩНОСТЬ, КОТОРАЯ ЕГО СОЖЖЕТ

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

С ассемблерными командами я разобрался - там ничего сложного. У меня не получается скомпилить ассемблерный код в WinAVR/gcc.

Во первых, не подключаются файлы с константами.

#include <avr/io.h> - при таком объявлении avr-gcc пишет, что значения не определены.

.include "avr/io.h" - ругается, что такого файла нет

.include "iom48р.h" (скопировал в папку с проектом) - "значения не определены"

Попробовал ещё сделать так:

.include "iom48р.inc" (откопал ассемблерный заголовочный файл) - выдаёт кучу ошибок:

1) gcc не понимает ".equ test_const = R20". При исправлении на ".equ test_const, R20" - понимает. А вот AVR Studio понимает наоборот (почему?)

2) не понимает конструкции ".def"

3) пишет ошибку в "ldi spmcrval, (1<<RWWSRE) | (1<<SPMEN)", говоря, что регистр должен быть старше 15-го. При этом ранее объявлено ".equ spmcrval, R20". Т.е. соответствия констант ассемблер не понимает. Если написать " ldi R20, (1<<RWWSRE) | (1<<SPMEN)", то ошибка исчезает.

Во-вторых, проблема с взаимодействием си и ассемблера. Надо, чтобы разные участки кода пользовались одними константами и переменными. Дублировать их специально для си и специально для ассемблера (используя разный синтаксис) - это бред.

----------------

Что касается задачи, то сейчас я пытаюсь сначала сделать весь код на ассемблере и разместить его в boot-секторе. Программа последовательно считывает байты по UART, при прочтении байтов 0x55, 0x55, 0x55 (команда на программирование) считываются следующие 64 байта, заносятся в ОЗУ, прошиваются в первую страницу флэш-памяти.

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

На ассемблере врядли удасться вам что-либо сделать. Ассемблер не сможет читать инлюды, которые для СИ.

Напишите на СИ. Для получения ассемблерного кода, который вы увидите для проверки и последующей подачи на сборку, вам надо компилировать с опцией -E компилятора. Получается выходной файл с расширением asm (что задано явно в командной строке). Вот конкретный пример:

Входной файл IntTable.cpp:

"D:\WinAVR\bin\avr-g++.exe" -E -fmessage-length=260 -I "D:\WinAVR\avr-libc\avr\include" -I "D:\WinAVR\avr\include" -B "D:\winavr\avr\bin" -mmcu=atmega8 -minit-stack=0x45F -msize -D __ASSEMBLER__ -D __AVR_ATmega8__ -D INCL_MSG -o "C:\BC2\MyProj\FiftyHZ\IntTable.asm" -Wall -Wextra -Wstrict-aliasing -Wmissing-noreturn -Wdeprecated-declarations -Wdisabled-optimization -Wpadded -Wpacked -Winline -Wuninitialized -Wunreachable-code -Wcast-align -Waggregate-return

-Wswitch-enum -Wswitch-default -Wswitch -Wshadow -Wunused-value -Wunused-variable -Wunused-parameter -Wunused-label -Wunused-function -Wunused -Wmissing-format-attribute -Wcast-qual -Wchar-subscripts -Wcomment -Wcomments -Wfloat-equal -Wformat-nonliteral -Wdiv-by-zero -Wendif-labels -Winvalid-pch -Wmissing-braces -Wmultichar -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wsign-compare -Wunknown-pragmas -Wwrite-strings

-fstack-limit-symbol=i3PaMiddleVUints -ftrapv -fverbose-asm -funsigned-bitfields -fno-builtin -fshort-enums -O1 C:\BC2\MyProj\FiftyHZ\IntTable.cpp

Выход: IntTable.asm

Потом компилируем этот IntTable.asm файл при помощи ассемблера:

"D:\WinAVR\bin\avr-as.exe" --defsym __ASSEMBLER__=1 --gstabs -o C:\BC2\MyProj\FiftyHZ\IntTable.obj -mmcu=atmega8 C:\BC2\MyProj\FiftyHZ\IntTable.asm

Выход: IntTable.obj

А сам файл на СИ был таковым:

#include <avr\io.h>

#include <avr\interrupt.h>

.section .vectors,"ax",@progbits

rjmp main

rjmp INT0_vect //INT0_vect

rjmp INT1_vect //INT1_vect

rjmp TIMER2_COMP_vect //TIMER2_COMP_vect

rjmp TIMER2_OVF_vect

rjmp TIMER1_CAPT_vect

rjmp TIMER1_COMPA_vect

rjmp TIMER1_COMPB_vect

rjmp TIMER1_OVF_vect //TIMER1_OVF_vect

rjmp TIMER0_OVF_vect //TIMER0_OVF_vect

rjmp SPI_STC_vect

rjmp USART_RXC_vect

rjmp USART_UDRE_vect

rjmp USART_TXC_vect

rjmp ADC_vect //ADC_vect

rjmp EE_RDY_vect //EE_RDY_vect

rjmp ANA_COMP_vect

rjmp TWI_vect

rjmp SPM_RDY_vect

.end

Это практически ассемблерная вставка в код на СИ. Тут, правда, кода на СИ не было, но из инклюдов компилятор вытащил что ему нужно.

Изменено пользователем AlexKlm
Ссылка на комментарий
Поделиться на другие сайты

Напишите на СИ.

А как на сях указать адрес загрузки отдельной процедуры? Чтобы основной код был прошит по адресу 0x000, а вот эта процедура (загрузчик) - по адресу 0xf00.

Во-вторых, у меня только 256 байт (128 слов) т.е.разумнее (экономичнее) писать загрузчик на ассемблере.

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

А почему не написать всю прогу на ассемблере тогда? :)

А AlexKlm видимо предложил перевести СИ в ассемблер, и уже в нём дописать загрузчик на ассемблере, и ещё раз скомпилить уже ассемблер.

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

Так я и пытаюсь сейчас написать всю прогу на ASM, но не компилится ничего. На сях компилится, на ассемблере -нет.

Да и потом, это я пишу "учебный" загрузчик для atmega48. А реально будет схема на atmega128 с довольно сложным кодом. Писать накой объём кода на ассемблере - гм...

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...