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

При выборе среды разработки для контроллеров не мало важным является наличие ограничений по времени использования, объему кода, набора поддерживаемых архитектур и компиляторов. Использование платных версий сред часто затруднительно, а порой и не возможно, ввиду высокой их стоимости. Наиболее популярным решением, к сожалению, является использование 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.: Эта самая «есен-пень» статья столь очевидна, что никто соответствующую «технологию» попросту не применяет. Видать считают это ниже своего уровня (странно, воровство почему-то не ниже их уровня).

Следующая >
  • +4
  • 28 ноября 2011, 12:31
  • angel5a
  • 3
Файлы в топике: odo.zip, res.zip, complite.s19.zip

Комментарии (32)

RSS свернуть / развернуть
Спасибо хорошая статья. Сам над таким задумывался когда картинки в коде не влезли в разрешенный объем CVAVR (конкретно им не пользуюсь, только его оболочкой для программатора). Но тогда все решилось установкой бесплатной прошивающей проги.
Действительно всякий раз задумываюсь, что часто в коде самого кода все ничего, а объем занимают разные строки, константы и тд., где особой работы компилятора инет.
0
И предел для меня — сингулярность! ©

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

Опыт взял на заметку. Спасибо.
0
Шеф, всё уже украдено до нас! (с)

Есть замечательная утилита, называется srecord, она понимает кучу форматов (в том числе моторолавские s файлыб hex, ассемблерные файлы, и много чего еще), умеет конвертировать из одного в другой и умеет объединять несколько входных файлов в один выходной. Вобщем-то то, что нужно для описанного метода.
0
«а сударь знает толк в извращениях»))))
0
Ну предположим вы вынесли картинки и статические вещи в ресурсы, а код то можно вынести? К примеру: скомпилить 8 килобайт процедур вынести в ресурсы, скомпилить еще 8 килобайт и потом все разместить в кристалле и пользоваться как 32 кило кода или нет? Я так и не понял.
0
Можно. Все делается практически также, нужно только следить, что бы сегменты не перекрыли друг друга.
В такой сборке по кускам с отладкой не очень удобно получается. Если данные еще можно подменять на лету, то подпрограммы так не подменишь.
0
Отладка работает так же «по модулям». Не удобно конечно что весь проект целеком нельзя отладить, но и не думаю что такое требуется постоянно, омневаюсь что кто-то пишет 20кБайт кода, а потом отлаживает всё скопом.
0
Просто обращу внимание на «Часть первая» в заголовке :)
0
О, да, мосье знает толк в извращениях! :D

А появление на рынке дешёвого внутрисхемного отладчика в виде STM8Discovery окончательно поставило крест на микроконтроллерах AVR.

Смеялся.

***

В целом, метод интересный, но имеет смысл только в единичных случаях/для саморазвития, либо если лень искать кряк, ибо слишком уж все это утомительно. К слову, Вы никогда не убедите меня в том, что кейген — это что-то нехорошее до тех пор, пока производители заламывают такие цены. Стоил бы тот же IAR $10 — я бы с радостью купил эту среду. Заметьте, что самой корпорации каждая копия не стоит ничего. Т.е., после того, как окупится зарплата программистов (а при таких ценах она окупается очень быстро даже за счет закупок компаний), корпорация начинает делать деньги из воздуха. Денег должна стоить не программа, а поддержка.
-1
  • avatar
  • _YS_
  • 28 ноября 2011, 17:21
И зря. Я окончательно на меги не забил только из-за работы.
А так плюсов по сравнению с теми же стм8 у них нет никаких. Кроме только DIP корпуса. Авр круче стмов8 только у химеры, правда кроме традиционного для него пиздабольства у него как всегда ничего не нет.
0
AVR не круче, AVR проще. А для большинства задач большего и не надо.
0
Это да, и регистров меньше и корпус удобней.
Но когда я смотрю цены на меги и стм8/32, то покупать первые у меня рука не поднимается. А потом еще вспоминается, что атмел зажал в 5 студии отладку без их девайсов за безумные деньги, то использовать их желание пропадает окончательно.
0
Ну, не знаю. У меня в локальном магазе ATmega48 в TQFP лежит за 44р.
0
А отладчик для нее сколько стоит? Да и цены на 8/32 не выше, а на многие модели ниже.
Хотя для старта авр будут наверное по лучше, именно из-за ее простоты. Или пик. Тут кому что больше нравится. Я пики вообще не перевариваю.
0
А отладчик для нее сколько стоит?

А оно надо? Не припомню, чтобы он мне когда-то помог…

Я пики вообще не перевариваю.

Аналогично. Для старта у AVR конкурентов нет и не предвидится.
0
А кстати — из 5 студии можно шить через СОМ программаторы? Или нужен клон mkII?
0
Запомни, стьюДЭНТ… Прежде чем спросить, воспользуйся гуглом!!! Неуч… )))))))
-4
Для старта у AVR конкурентов нет и не предвидится.
Смелое заявление… ))
У новых ПИКов много вкусностей при низких ценах… Да и… ногодрыгами они всегда хорошими были, и даже устаревшие чипы с производства не снимают… ))
0
А как же стандартный 8051? Проще только PIC10F200.
0
Профи юзают… Начинающие… не встречал… ))
0
Авр круче стмов8 только у химеры
эРПаЦан слово высрал??? )))))))))))
Ну ТЫ и сказачный далпаёп!!! ))))))))
Или ТЫ эРПаЦак??? )))))))
Тогда… быстро расплылся в «КУ»!!! Соблюдай цветовую дифференциацию штанов!!! ))))))))
-4
В своё время применил другой трюк на кодеварриоре — писал часть кода на Си, а потом дизассемблировал и вставлял куски в асмовский проект, попутно оптимизируя. Но правда делал это не по той причине, что и автор, просто очень люблю писать на ассемблере, а так получалось быстрее, и ещё было интересно сравнить результаты. Обойти ограничения таким образом тоже можно.
+1
  • avatar
  • mws
  • 28 ноября 2011, 18:49
… а что для stm8 нет gcc?
0
Неа… В этом-то и весь сыр-бор… ))
0
Нет.
Точнее нет вменяемого и рабочего.
0
Hету, что сильно ограничивает продвижение на рынке этого прекрасного семейства. А лицензия на IAR- 3000$. Пичалько, как теперь модно говорить.
0
А лицензия на IAR- 3000$. Пичалько, как теперь модно говорить.
ИАР и STM8 — вещи малосовместимые… За такое УГ платить бабло… пусть идут лесом… грибы собирают…
Космик адекватнее, но со своими тараканами…
0
IAR имеет общую среду для всех платформ: от 8051 до армов, инженерам удобно.
0
С точки зрения универсальности и силы привычки… может быть…
Если сравнивать 1.2 и 1.3… то — да… что-то поправили… но не до конца…
Не… можно, конечно, СИшный исходник асмовыми вставками разукрасить, но… насколько помню, с АСМовым инлайном всегда у ИАРа плохо было… ))))
0
Уважаемые. Попрошу прекратить демогогию по поводу «кто круче: авр или космик». Мои умозаключения приведены только как вводная часть: «как я до такого докатился», почему именно на примере STM8 и IAR. Повторюсь, аналогичный подход применим и в PICах и в AVRах, и в IAR и в AVR Studio.
Приведён способ, теория, подкрепленная на практике на примере STM8 (по этой причине статья и размещена в тематический раздел STM8).
0
Я что-то никак не могу взять в толк. Если использование кейгенов для отключения ограничения — это тупое воровоство, разве использование подобных методик по обходу ограничений не есть воровство? Конечно тупым его уже никак не назовёшь, но ведь автор не получает от этого ни на цент больше.

Статья полезная, автор молодец. Хотелось бы больше примеров использования такого подхода в мирных целях на полноценных тулчейнах. Например для встраивания тех же картинок в проект. Или скажем разделение кода и бутлоадера. Или кода виртуальной машины и программы для неё. Там RTOS и «файлов» программ.
0
Собственно чем это не пример для виртуальной машины и выполняемого ей кода? вместо картинки скрипт, вместо основной программы виртуальная машина. Бутлодырь вынисти довольно не сложно, даже статью писать лень. После третей части думаю станет ясно как проделать это самостоятельно.

P.S.: В данном случае разработчик знает про «такую возможность обхода ограничений». Более того её, можно сказать, делают специально (касательно второй и третьей части цикла). Данный подход так же ни противоречит лицензии (ограничение на размер генерируемого кода для проекта, ограничения на количество проектов нет, ограничения на количество прошиваемых контроллеров так же нет). Фактически это эквивалентно доставке при покупке товара: вы можете на халяву перенести 3 тонны гвоздей самостоятельно в сумках, а можете заказать за денюжку газель, которая перевезёт всё сразу быстрее и удобнее. или тот же насос: на 100мл можете юзать бесплатно, а за 2кубовый платите денюжку и не напрягайтесь. Или по вашему надо сажать владельцев велосипедов, за то что они не купили себе машину?
Применение же кейгенов и кряков прямо противоречит условиям лицензии. Идет явное нарушение условий использования, которые производитель установил на свой продукт.
Надеюсь я разъяснил в чем различие? :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.