Преодолевая пределы. Часть первая. Ресурсы.

При выборе среды разработки для контроллеров не мало важным является наличие ограничений по времени использования, объему кода, набора поддерживаемых архитектур и компиляторов. Использование платных версий сред часто затруднительно, а порой и не возможно, ввиду высокой их стоимости. Наиболее популярным решением, к сожалению, является использование crack’ов и keygen’ов. Но мало кто задумывается над способами легального использования средств разработки «не загоняющими вас в узкие рамки». В предлагаемой серии публикаций будет рассмотрено два способа использования среды разработки с ограничением по объему для создания прошивок, куда большего размера.

Как всё начиналось (вода)

Естественно, что появление в свободном доступе дешёвых восьми битных контроллеров вызвало у меня интерес. Отличная замена AVR подумал я. А появление на рынке дешёвого внутрисхемного отладчика в виде STM8Discovery окончательно поставило крест на микроконтроллерах AVR. Накачав всевозможных средств разработки, я приступил к их изучению. Вот тут то и оказалась загвоздка.

ST Visual Develop. Компания STM для своих контроллеров предлагает бесплатную среду разработки, но она включает только ассемблер. На ассемблере писать то можно, но не 32 килобайта же кода. Это сколько времени уйдет на разработку. Да и в конце концов, не в 20 веке живем, когда каждый байт, и каждый такт были на счету (золотое было время, однако). Нет, такой вариант нас не устраивает. Надо думать что-то другое.

К счастью к среде можно подключить Си компилятор других разработчиков: Cosmic и Raisonance. К чему я и приступил.

Raisonance. Ребята оказались красавцы. Мой запрос регистрации они просто проигнорировали. В итоге их компилятор у меня больше не живет.

Cosmic. Я конечно не спорю, я сам долго тормозил и не ставил среду. Недостаток ли свободного времени то был или лень, но между загрузкой cxstm8_16k (бесплатная версия до 16кбайт и без лимита по времени) и попыткой её активации прошло 3 месяца. За это время указанная версия перестала существовать (с 1 сентября 2011года она не доступна) и активирована быть так же не может. Таким образом, из доступных вариантов осталась только годовая версия на 32кбайта. Но что-что, а ограничения по времени не для меня. Так Cosmic постигла та же участь что и Raisonance. Но всё же стоит поблагодарить поддержку Cosmic. Если я дорасту до платной версии, то вы будите первыми претендентами.

Печально, в прочем средства от ST удалять спешить не будем, они ещё пригодятся.

IAR. Практически от всех кто её использовал, мне доводилось слышать «Она лучше ***, так как *** основана на Eclipse» и прочий абсолютный бред. По сему установлена IAR была в последнюю очередь. Что сказать: активация прошла без проблем... оба раза, компилирует, отладка работает, внутрисхемная тоже. Из ограничений бесплатной версии 8кбайт кода.

Платные версии не рассматривались. Изучение и разработка идет для себя самого, а денег платные версии просят достаточно много. Я не готов пока отдавать такие средства, за неизвестно что.

Кряки не рассматривались в принципе. Думаю все и так в курсе моих мировоззрений в отношении лицензионного ПО.

Итог: В качестве среды разработки выбрана бесплатная версия IAR. В качестве вспомогательных утилит бесплатный набор ST Toolset.

Как быть с ограничением в 8кбайт (вода)

А мозг как всегда требует выноса. Половина контроллеров STM8 имеет 32кбайт флэш-памяти, как их можно задействовать, имея среду с ограничением в 8кбайт? И не важно же потребуются ли они мне. Интересен сам процесс. Интересно преодолевать преграды, порою поставленные самим собой, брать ране непреодолимые высоты, покорять новые вершины. Интересно развиваться.

И ей богу, ну не понимаю я людей что, встретив ограничение в программе, качают кряки. Вы увядаете в развитие. И никакое «не отдадим буржуям наши деньги» тут не оправдание. Вы попросту грабите разработчиков. Превращаетесь в жалких тупых воров. Но впрочем, я отвлекся.

И так, задача ясна: «Получить возможность использовать всю доступную в контроллере флэш-память, при использовании среды с меньшими возможностями». Ориентируемся на IAR, а по возможности учитываем и существование других сред.

Подопытный кролик

Изначально хотелось помигать светодиодом, да что-то передумал. Наверное, потому что Discovery и сама это прекрасно умеет делать. Тогда в качестве жертвы выберем многострадальный и куда только не втуляемый дисплей от Nokia 3310. А что поделать, нравятся мне всевозможные дисплейчики. Так совместим приятное с полезным.

Как создавать проекты в IAR объяснит dcoder с сообщества в своем курсе, я надеюсь. Для самого дисплея возьмем ту же библиотеку что и в восьмом уроке моего курса по LPC1343 и чуток подработаем её напильником для запуска на discovery (полный код в архиве).

Ресурсы (Resources)

Что такое ресурсы? Ресурсы - это просто набор байт данных.

Что может быть в ресурсах? Да что угодно. Ресурсы могут быть строковые, графические, числовые или просто двоичные. Предположим мы хотим, что бы наш контроллер выводил на экран логотип при загрузке. Данная картинка и будет являться ресурсом. Строка приветствия - ресурс. Таблица шрифта для вывода символов на дисплей так же является ресурсом.

Ресурсы хорошо знакомы программистам под Windows (с применением WinAPI). Но конечно предлагаемая мной модель ресурсов отличается от модели применяемой в WinAPI. В частности я отказываюсь от такого понятия как «загрузка ресурса», чем меньше копирований, тем лучше. Так же у моих ресурсов не предполагается поиска по имени, имя у ресурса будет только чисто символически.

И так, ресурс – набор байт, расположенный по определенному адресу. Давайте сделаем вид, что нам не хватило 500 байт под логотип, и поместим изображение в ресурсы.

Как создать?

Я не ищу лёгких путей и пошел через лесы-горы-напрямик.

Для создания ресурсов применяем ST Visual Develop. Создаём assembler проект и в основном файле размещаем (заменив любезно созданный средой шаблон) примерно следующее:

stm8/

	WORDS
	segment byte at A000-A1F7 'logo'

	segment 'logo'

image
	dc.b $02, $01, $00, $00, $00, $00, $00, $03
	… и ещё 60 строк данных картинки
	dc.b $ca, $a5, $d2, $65, $32, $1c, $08, $00
	dc.b $00, $00, $00, $00, $00, $00, $00, $00
	end

Да, не для слабонервных. Но кто заставляет вас набирать всё это дело ручками? Для получения такого файла вполне можно написать небольшую утилиту и пользоваться потом ей. Так в архиве ConvertIntro.zip имеется программа, формирующая C-source, stm8-asembler и двоичный файл.

А без всевозможных утилит в ассемблере легко создаются ресурсы строк:

	WORDS
	segment byte at A200-A2FF 'strings'

	segment 'strings'

table
	dc.b "Hello World", 0

По своему усмотрению либо собираем все файлы вместе в одном проекте, либо вообще все в один файл сливаем, либо с каждым файлом работаем по отдельности. Хоть в одном проекте по очереди, хоть в разных проектах – не суть важно.

Далее убеждаемся что в меню "Project" -> "Settings" на закладке "ST Link" поле "Format" имеет значение "Motorola S-record".
Окно свойств проекта

После чего жмем “Build(F7)”. Всё, теперь у нас есть *.s19 файл ресурса картинки. В прикрепленном архиве res.zip можно его попробывать найти.

Как прошивать?

Для заливки ресурса картинки во флэш-память контроллера можно воспользоваться, например ST Visual Programmer.

Для этого выбираем раннее сгенерированный файл *.s19 и жмем «Program address range», указываем начальный и конечный адреса ресурса и жмем «OK». Вот собственно и всё.
Задание области адресов для программирования

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

Как использовать?

С получением доступа к ресурсу всё гораздо проще, чем может быть. Адрес ресурса нам известен. Нам достаточно подставить этот адрес там, где требуется использовать ресурс. При этом не важно какой вы используете компилятор: Cosmic, Raisonance или IAR.

// исключительно для удобства пишем макрос (даём ресурсу «локальное имя»)
#define intro	((const unsigned char*)0xA000)
// используем ресурс (intro – данное ресурсу «локальное имя»)
LCD_screen( intro );

Таким же образом можно было бы вынести и все строки, и таблицу символов, и любые другие неизменяемые данные. При задании соответствующего макроса нет разницы, что данные находятся в ресурсах, что тут же в коде. Полный код можно посмотреть в прикрепленном архиве odo.zip.

Результат

Собственно после запуска программы в среде IAR мы можем наблюдать картинку из ресурса:
Отображение картинки из ресурса Вывод текста из ресурса

Почему именно так? (вода)

Почему контроллер прошивается ST Visual Programmer? Просто было взято то, что есть под рукой. Программа поддерживает прошивку только выбранной области, что и используется. Если у вас имеется boot-loader какой или другая программа позволяющая залить страницу-другую в требуемую область, то вполне можно ей воспользоваться.

Почему для ресурса используется *.s19 файл? Просто я так решил. Файл *.s19 был выбран первым при открытии ST Visual Programmer, и его умеют формировать обе среды. С тем же успехом можно применить и *.hex файл. А вот двоичные файлы, к сожалению, не поддерживаются программой ST Visual Develop, из-за этого и пришлось прибегнуть к услугам ассемблера.

Почему для формирования *.s19 файла применялась ST Visual Develop? И просто так тоже. Но основное внимание уделялось «что бы всегда было доступно». Среда от ST предлагается бесплатно и без ограничений. Таким образом, даже не имея под рукой оригинальной среды разработки, остаётся возможность заменить тот или иной ресурс. В следующей статье будет предложен вариант подготовки ресурсов в среде IAR, только что бы ни использовать десяток сред для простой задачи.

Почему утилита формирует ассемблер-файл, который затем компилируется студией, почему не формировать сразу *.s19 или *.hex файл? Просто мне было лень разбирать данные форматы, и сделал то, что знал. Пока мне это не критично и у меня есть студия. В дальнейшем, что маловероятно, сделаю программу с GUI интерфейсом и культурным выбором формата. Вы же для себя можете написать что пожелаете.

Разработка в заводских масштабах

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

Возвращаемся к ST Visual Programmer и обнаруживаем в нем возможность "клонирования" контроллеров. На самом деле, после всей этой заливки прошивки по частям мы можем нажать "Read current tab or active sectors" или "Read all tabs" и у нас будет полная прошивка контроллера. Просто в меню выбираем "File" -> "Save As…" и получаем *.s19/*.hex файл, который можем одним махом записать во все остальные контроллеры. Я дополнительно из этого файла убираю ненужные нулевые строки. Но в принципе то это не обязательно.

А вот если вам в десяток устройств надо поместить один код, но разные картинки, текст, последовательности команд вашей виртуальной машины, то «ресурсы» самый подходящий для вас выбор.

Прилагаемый файл complite.s19 представляет полную прошивку платы STM-Disсovery с примером из данной статьи.

Вместо заключения

Использование «ресурсов» в единичных разработках не доставляет больших неудобств. Применение в серийном производстве так же не является проблемой.

Изложенный выше принцип естественно не ограничивается ни семейством STM8, ни средой IAR. Технологию "ресурсов" можно применять для STM32, LPC и AVR (остальные полагаю тоже не исключение). И пускай программа пример и так укладывалась в лимиты, но ведь это только пример.

Изложенный способ будет наиболее удобен тем, кто использует среду ST Visual Develop с компилятором от Cosmic или Raisonance. В следующей публикации будет рассмотрен способ формирования ресурсов в среде IAR.

P.S.: Эта самая «есен-пень» статья столь очевидна, что никто соответствующую «технологию» попросту не применяет. Видать считают это ниже своего уровня (странно, воровство почему-то не ниже их уровня).

Файлы: complite.s19.zip, odo.zip, res.zip

Следующая >
Hosted by uCoz