ПредишенСледващото

В предишни публикации вече показах, от която можете да ликвидирам при писане на програми за STM32F4, настройте компилация околната среда, ние определихме оформление файл, за да се получи един модел файл на програмата на асемблер, опитайте се да конфигурирате GPIO микроконтролер и светодиод примигна.

Сега е време, за да разбера за съставяне на програми, състоящи се от множество файлове, уверете се намери начин да се пишат програми за редица отстраняване на грешки дъски, научете се да направите настройките на приложението за лесна промяна тях

Да започнем с най-простите: механизъм на условията компилация

  1. сключено на 15 GPIO_D за STM32F4 Discovery
  2. сключено 2 GPIO_H за Open407I-C

Събиращия GNU AS е механизъм на условията компилация.
Екипът е открил .def - според документацията е необходимо да се създаде стойност, но не успя да го да работи, така че аз бях на директива ".set".
(! Не на програмата) Първоначално, ние присвоите променлива компилатор Някои стойност, аз избрах името на променливата DEVBOARD:

Създаване на тези параметри за условията компилация е както следва:

всички "пряка" препратки GPIOD (GPIOH) сега се промени, за да GPIO_LED Текстът на програмата. стойност за RCC_AHB1ENR замени RCC_GPIO_EN нататък и така нататък.
Ние се получи следната програма:

Сега мисля за сравнително големия размер на програмите, които е малко вероятно да бъде удобно да пиша в един файл, както и че ще се състои от няколко (може би дори няколко десетки) файлове.
Ние разгледаме един пример от нашата програма "мигач": тя е рутинна, която реализира пауза между включване / LED изключен, сега това е просто един цикъл с фиксиран брой на цикличните очаквания, но в бъдеще, рутинна може да бъде пренаписана да използва системния таймер - и това подпрограма е правилен поставете в друг файл.
Включване на файлове могат да бъдат директива ".include" асемблер:

Това решение е много проста и доста ефективно, но има един, на пръв привидно незначителен недостатък - общо пространство на имена на маркировката.
Докато програмата няма да е над 150-300 инструкции - вие няма да имате никакви проблеми в "изобретяването" имена маркер, като например следните рутинни забавянията могат да започнат с етикета "DELYA1:" и след с още някаква комбинация, но това не е така просто, веднага след като започнете да създавате собствената си библиотека на съчетания и да започнат да ги използват в различни комбинации - не забравяйте да започнете пропускателни имена тагове.
Едно от решенията - въведение в името на името на етикета на файл префикс източник код, например за нашето закъснение подпрограма, можете да посочите следното име етикет "DELAY_ASM_DELAY:" Опитах се отново по този начин, макар и не без резерви - всъщност в процеса на разработване на някои модули може да се намират в поддиректории на проекта, както и че не е имало име пресичане марки следва да съдържат не само името на файла, но името на директорията "DIRECTORY_DELAY_ASM_DELAY:" (например директория с име "указател", в края на краищата, ако все още се нуждаем името на маркер, който се състои от 2- 3 думи за яснота - получаваме абсолютно monstroidalnye имена на етикета: "DIRECTORY_DELAY_ASM_DELAY_LOOP_0x10000:" ...

Друг начин е да отделни програмни файлове компилация код.
В действителност, асемблер може да се компилира отделно и main.asm delay.asm файл. и след това при връзка - съставен тези две части са комбинирани в крайния фърмуер.
Тъй като всеки .asm файл ще бъде компилиран отделно - в началото на всеки трябва да включва задаване на настройки за съставяне и, ако е необходимо, да включи файла с константи.
С цел да се каже на компилатора какво етикет този файл може да се използва от външната страна - с помощта на директивата ".global".
Помислете съчетания текст, когато е поставен в отделен файл за разделно събиране:

В съответствие с това на етикета ЗАБАВЯНЕ обявен за .global ще бъде на разположение, за да бъде извикан от друг софтуер файлове източник, но етикетът е достъпен само в рамките DELAY_loop delay.asm файл и всъщност името на етикета, може без никакви ефекти, използвани в други части на програмата - пресечната точка няма да бъде!

в текста на основната програма според де факто съществуващите правила трябва да включват директивата ".extern", който сочи към етикет, който е определен в друг файл, и ще бъдат свързани с оформлението на сцената, но документацията на GNU, както е посочено, че директивата е преминал за да се гарантира съвместимост, както и всяка не е намерена в етикетите за съставяне на файла източник и константи се считат за глобални. Подход според моето спорно, въпреки външните стойности на етикетите и константи показват ясно по-добре.

както се вижда от по-горе опции - без допълнително ".include" не трябва да се прави за включвания файл! превключвател ще обработва свръзката.

компилация на проекта и процеса на сглобяване трябва да бъде, както следва:

Сега ясно се вижда недостатък на такава схема за определен програмист: необходимо е да се проведе компилация от отделни файлове и след това в събранието да се уточни получените компилирани файлове. Правейки това ръчно постоянно редактиране make_project.bat файл сравнително рутинна дейност, така че този процес трябва да се предаде на някой друг, "силни рамене"
Малко експеримент "в събота", аз написах нова .bat файл събиране проект автоматично.
Ние трябваше да се направят някои промени в структурата на директорията на проекта в "споразумение" за именуване на файлове:

  1. изходния код се намира в поддиректория SRC / проекта:
    Stm32f4 GNU като адаптивни компилация среда (част 4)
  2. поддиректория компилация / поставени файловете са готови за мига, в поддиректория на компилация / температура / поставени в помощните файлове компилирани файлове, файлове ценности и т.н.
    Stm32f4 GNU като адаптивни компилация среда (част 4)
  3. ще състави всички файлове са от поддиректория / SRC и с .asm разширение. В този случай, файловете, които ще бъдат включени .include директива не трябва да имат .asm разширение - както в този случай те ще бъдат класирани по два пъти - за първи път в програмата, в която те включват директива .include. и отделно да се разширява.
  4. по пътя на всички файлове, които са включени в екипа на .include проект трябва да започне чрез посочване директория SRC / на. например, за да бъде написана файла с константи, която е в SRC / директивата, както следва .include «SRC / const_file.inc»

Компилация прави следния скрипт поставен в

Папка на проекта трябва да се постави в папката, в която в пътя си, няма интервали в имената. Българските букви в имената на директориите са позволени.
Така тече път: D: / MoyProekt / gnuas / първи / - е допустима, но D: / Моят проект / gnus / първи / - няма да позволяват на (име на папката "My Project" съдържа интервал)

Според раздел фърмуер .text направят обяснение:

Този запис показва линкера че секцията трябва да се поставят в реда, в който са описани.
За да прекъснете вектор въведох раздел .vectors, този раздел, трябва да отговарят на програмата само веднъж (което е логично, тъй като масата за вектор в нашите програми, че досега само един).
допълнително Декларирам част на програмата, където ще бъде поставен на текста: на .text и .asmcode - на "идея" .text участък ще бъде гарантирана на разположение след таблицата с вектор - в този раздел да поставя различни съчетания на услуги (например, "тапи" прекъсване) и Но в .asmcode раздел пиша текста на програмата.
Така поговорката в .vectors секционните програма I гарантират неговото поставяне в началото на програмата, независимо от това колко е указан файл с внимание при свързване main.o
Редът на поставяне на няколко секции .asmcode. един спрямо друг са склонни да имат не е от значение (добре, за да бъде доста честни - това със сигурност играе, но това е само за много големи програми, но това все още е твърде рано да се мисли за)
.rodata раздел - раздел на константите в светкавица, разпределени отделно за удобство, по-лесно е да се обясни какво е необходимо в този пример:

и константата се поставя в отделен раздел след секции .rodata .asmcode
Дреболия. - Да! Но понякога това е много удобно!

Надявам се, че основните идеи, които ме местят, когато формират секции станаха ясни, а сега е необходимо да се направят промени в нашия проект "мигач", с два файла на програми източник на именуване на секции

Сега, независимо по какъв начин ние не даде файловете на оформление - раздел .vectors винаги ще бъде в началото на изходния файл, както и секцията .asmcode след това ... но които част от програмата ще отидат веднага след указатели маса за прекъсване (main.asm или delay.asm ) - ще зависи от реда на тяхното подреждане (който се изправи - че и маратонки преди и публикуван)

Какво друго е необходимо за пълно щастие? писането програми в асемблер за STM32F4?

послепис Щях да забравя да прикачите blink4.zip на файла

Подкрепете проекта - споделете линка, благодаря!