ARM. Учебный курс. IAR EWARM. Создание проекта.

Если ничего нет, но очень хочется… :-)

Не Keil’ом единым…
Есть такая компания, называется она IAR Systems. Делает много вещей, в том числе и среды разработки и компиляторы для различных архитектур, список которых довольно обширен. Также в числе продуктов компании есть отладчики, наборы разработчиков и т.д. Более подробно со всем этим разнообразием можно ознакомиться на их родном сайте iar.com

Нас же сейчас интересует среда для разработки приложений для архитектуры ARM, в частности Cortex-M3. Есть в их ассортименте и такой продукт и называется он EWARM, что является сокращением от Embedded Workbench for ARM, что в свою очередь, в моем вольном переводе на великий и могучий, звучит примерно как «Среда разработки для встроенных систем на архитектуре ARM», впрочем, за точность я не ручаюсь…

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

Но по причине отсутствия у меня какого либо девайса для внутрисхемной отладки рассказать я про все это не могу. А пользоваться симулятором как-то в голову даже не приходило. Я по старинке, пишу, заливаю в контроллер и смотрю что происходит. (Зато их есть у меня. И я вам скоро выдам пример того, какой это рулез. прим. DI HALT)

Есть мнение, что компилятор С/С++ у IAR один из самых лучших, но за это я не ручаюсь, хотя кое какие мои сравнения с Keil uVision v3 показали его превосходство.

В общем, это мощнейшая полноценная среда для разработчика. Кому интересно, изучайте описания на официальном сайте Есть ли версия для линукса я на сайте нигде не углядел, поэтому точно не скажу. (Боюсь, что как всегда ;) Впрочем, там есть могучий и универсальный GCC и обязательно есть поддержка ARM. Так что если есть желающие показать старт проекта под линухом — ждем с распростертыми обьятьями. Пишите на dihalt@dihalt.ru прим. DI HALT)

На момент написания данной статьи доступна версия 6.10 (я же буду рассказывать на примере версии 5.4).

Сколько стоит данное чудо я, к сожалению, на их официальном сайте найти так и не смог, а лазить по сайтам дилеров как-то недосуг… На наше счастье, данный продукт доступен в демо режиме для ознакомления. (Я тоже полазил, не нашел. Кейл стоит около 3 килобаксов. IAR, думаю, в тех же пределах. Вполне подьемно для коммерческого применения прим. DI HALT)

И здесь есть 2 варианта

  • 1. Полнофункциональная версия с ограничением использования в 30 дней.
  • 2. Версия без ограничения по времени использования но генерирующая код не более 32Кб. Под наши ковыряния хватит с лихвой.

Обе версии, кроме того имеют следующие ограничения:

  • Они не включают исходный код библиотек.
  • Они не включают поддержку MISRA C (что это такое, к сожалению не знаю).
  • Имеют ограниченную техническую поддержку.
  • Версия с ограничением кода в 32Кб не имеет поддержки расширенной отладки (что это такое, к сожалению не знаю)

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

После установки можно приступать к созданию проекта. Запускаем IAR Embedded Workbench и видим следующее окно:

Лирическое отступление.
Если кто-то, как я, привык для копирования/вставки использовать сочетание клавиш Ctr+Insert/Shift+Insert, то его ждет засада! EWARM по умолчанию понимает только Ctrl+C/Ctrl+V и при нажатии Ctr+Insert или Shift+Insert только меняет режим вставки/перезаписи текста. Почти месяц меня это жутко бесило, пока однажды мне не стукнуло что-то в голову и не пришла мысль порыться в настройках… Оказалось, что это легко лечится путем назначения сочетаний клавиш командам! Делается это во вкладке меню Tools->Options, далее Keybindings.

Выбираем в меню:

 Project->Create New Project

Открывается окошко создания нового проекта.
На данном этапе можно выбрать из шаблонов, что именно мы хотим создать, но выбор там не велик, а все шаблоны содержат пустые заготовки файлов с нужным расширением и заголовками. Поэтому не ломаем голову а выбираем

C->main

и жмем кнопочку ОК

Появится диалог выбора имени проекта и указания, куда его сохранить. Называем проект милым вашему сердцу названием и сохраняем в укромном месте. Я же назвал его LEDTest, что какбы намекает… В итоге получаем следующую картину:

Создался новый проект содержащий только один файл main.c который содержит только одну пустую функцию main(). А вы хотели большего? Дальше все ручками.

На данном этапе желательно нажать на кнопку с изображением трех дискеток или через меню

File->Save All.

EWARM попросит ввести имя WorkSpace (воркспейс может содержать множество проектов) и не мудрствуя лукаво я назвал его также LEDTest.

В отличие от Keil’a EWARM не попросил указать целевое устройство и все остальное, поэтому лезем в свойства проекта и начинаем его настраивать.

По аналогии с Microsoft Visual Studio EWARM позволяет создавать произвольное число конфигураций и по умолчанию создает в проекте 2 конфигурации Debug и Release, что подразумевает 2 набора параметров, одни для компиляции кода содержащего отладочную информацию и другой для кода без нее. Выбираем наиболее подходящую для себя.

Я, например, сразу выставляю Release и настраиваю только ее, но это дело вкуса и наличия или отсутствия у вас средств отладки.

Итак, идем в меню

Project->Options

Либо нажимаем Alt+F7, либо тыкаем правой кнопкой мыши на корне дерева слева и выбираем в меню Options. Появляется окно настроек проекта.

Первая категория – General Options
Здесь желательно выбрать ядро для которого нужно откомпилировать код или указать конкретное устройство. По умолчанию указано ядро ARM7TDMI. Переключаем радиобуттон на Device, нажимаем на кнопку справа от поля ввода и в списке выбираем

ST->ST STM32F10xxY

, где Y соответствует семейству имеющегося у вас микроконтроллера. Я выберу ST STM32F10xxE.

Далее по вкладкам и категориям буду пробегаться кратко и без картинок т.к. вкладок много и не все они важны для нас на данном этапе. На существенных остановлюсь подробно.

Output (вывод)
Здесь указываем что мы хотим получить навыходе, исполняемую программу или библиотеку. Оставляем без изменения – Executable. Также здесь можно прописать пути куда ложить откомпилированную программу/библиотеку, объектные файлы и файлы листингов. Меняем, если душа того просит.

Library Configuration (конфигурация runtime библиотеки языка С). Это тема отдельной телепередачи :-) но сейчас можно смело поставить None и пройти дальше.

Library options (опции стандартной библиотеки языка С)
Здесь настраивается работа функций printf и scanf. Вернее поддержка различных ключей строки форматирования. Ниже кратко расписано какая опция что поддерживает, а более подробно можно прочитать в документации идущей в комплекте с EWARM. Поддержка более сложных ключей форматирования увеличивает размер кода т.к. обработчики строки форматирования разные по сложности реализации. В данном проекте нам это не важно т.к. данными функциями мы пользоваться не будем. А в последущием я освещу данный вопрос подробнее.

MISRA-C: 2004 и MISRA-C: 1998. Настройки расширений MISRA-C. Что это такое, я честно не знаю. :-)

C/C++ Compiler (настройки компилятора С/С++)
Здесь настраивается поддержка расширений языков С/С++, режимы оптимизации компилятора, генерация отладочной информации, пути к инклудам и т.д. Здесь пока можно ничего не трогать.

Assembler
Соответственно настройки языка ассемблера. Здесь пока можно ничего не трогать.

Output Converter (конвертация вывода)
Вот это нам нужно. Дело в том, что по умолчанию EWARM генерирует исполняемый файл в формате ELF, что какбы намекает, что Unix и прочие линуксы IAR’у не чужды.

Но нам то они ни к чему, поэтому смело тыкаем галку Generate additional output (генерировать дополнительный выходной файл) и в списке Output format (формат выходного файла) выбираем подходящий для себя, вернее для используемого вами программатора, формат.

Выбор особо не велик и реально для большинства будет состоять из двух вариантов: Intel extended, в простонародье именуемый HEX или binary. Я лично пользуюсь вариантом binary. Здесь же, если того требуют ваши религиозные убеждения, можно задать имя выходного файла отличающееся от дефолтного.

Custom build (пользовательская сборка)
Здесь можно задать дополнительные утилиты и их параметры которые будут использоваться при сборке проекта, но нам это ни к чему — пропускаем.

Build Actions (действия при сборке)
Здесь можно указать команды которые нужно выполнить перед сборкой или после. Поступаем аналогично предыдущему пункту.

Категория Linker (линковщик)
Вот и добрались до второго, после указания целевого устройства, важного момента! Ибо от линковщика, вернее его настроек, очень сильно зависит запуститься ваш проект в микроконтроллере или нет т.к. именно линковщик располагает код и различные таблицы (например векторов прерываний) по нужным адресам.

Вкладка Config (конфигурация). Здесь содержится ссылка на используемый файл конфигурации линковщика. Это очень важный файл т.к. именно в нем прописана конфигурация нашего микропроцессора в части памяти (ее наличия или отсутствия, адресации и размера), размещения таблицы векторов прерываний, размеры стека и кучи. По умолчанию проставлена ссылка на файл конфигурации идущий в комплекте с EWARM’ом и едином для всех устройств на базе ядра Cortex, что не есть хорошо, т.к. устройства все разные, объемы флеша и ОЗУ у них разные и т.д. К счастью, есть возможность отредактировать этот файл самостоятельно, что дает широчайший простор творчеству, либо с использованием кнопки Edit… находящейся здесь же.

Самостоятельная конфигурация файла настроек линковщика, занятие бесспорно увлекательное и плодотворное, но оно выходит далеко за рамки данной статьи т.к. только об этом можно написать не одну статью. Подробно все описано в руководстве пользователя, идущем в комплекте с EWARM. Скажу лишь, что там можно создавать сегменты памяти, указывать их тип, размер, размещение и еще много чего. Иногда это очень нужно, но это уже в более серьезных проектах.
Поэтому ограничимся нажатием кнопочки Edit… Правда перед этим нужно решить один концептуальный вопрос.

Дело в том, что как я уже сказал выше, данный файл является заготовкой для всей архитектуры Cortex, поэтому если вы его измените, а потом захотите создать проект для другого контроллера, того-же NXP LPC17XX, то его опять придется редактировать уже под этот процессор. Тут есть 3 варианта решения:

  • Сказать себе, что кроме STM32F меня ничего не интересует и отредактировать данный файл.
  • Скопировать данный файл в той-же папочке где он лежит (а лежит он, как можно догадаться, в папке диск:путь куда установили EWARM\arm\CONFIG\) во что-то типа STM32F10XXX.icf и редактировать его.
  • Скопировать его в папочку с проектом переименовав во что-то типа STM32F10XXX.icf и редактировать его.

Итак, выбираем вариант себе по душе (я лично пользуюсь 3-им вариантом а путь прописываю так:

$PROJ_DIR$\stm32f103re.icf

Переменная $PROJ_DIR$ разворачивается в путь до папки с проектом автоматически, т.е. путь получается относительным. Таким образом можно папку с проектами копировать потом куда угодно и файл не «потеряется» в отличие от использования жесткого пути), выбираем свой файл отредактировав путь или нажав кнопку выбора файла (кнопка с «…» справа от едита) и нажимаем кнопку Edit…

В появившемся окошке в первой вкладке Vector Table задаем адрес таблицы векторов прерываний. Что это такое, для тех кто не в курсе, я не буду раскрывать. (Я тоже не скажу :), т.к. все уже сказано в разделе про AVR. Тут все точно также, только векторов больше. прим DI HALT)

Адрес может быть либо 0х00000000 либо 0х08000000. Я предпочитаю ставить 0х08000000 т.к. он указывает на начало внутренней флеш памяти, а адрес 0х00000000 может мэпиться на флешку а может и нет, в зависимости от состояния входов BOOT в момент инициализации контроллера, но это нужно уже курить даташит на устройство.

Вкладка Memory Regions (регионы памяти).
Здесь задается 2 важных для работы контроллера вида памяти ROM (ПЗУ) и RAM (ОЗУ) вернее их адреса начала и окончания. ROM — это наша внутренняя флеш память. Начинается она с адреса 0х08000000, это заложено в архитектуре контроллера. А вот заканчивается у каждого по разному. Зависит от объема который есть в вашем контроллере.

У меня ее 512Кб, а у вас может быть 32, 64, 128, 256. Т.е. адрес окончания этой области памяти вычисляете сами. Для меня он будет равен 0x0807FFFF (адрес начала 0x08000000 + размер флеша (512*1024) – 1 в шестнадцатеричном формате). Для вас это может быть 0x08007FFF, 0x0800FFFF, 0x0801FFFF и т.д. Желательно указывать точный размер чтобы полученная прошивка не превысила этот размер, а так линковщик ругнется в случае чего. Но нам это не грозит пока. Аналогично заполняем поля для RAM, зная из чтения даташита, что она начинается с адреса 0x20000000 и посчитав где она закончится.

Если ошибетесь в этих адресах, особенно начальных, например нолик пропустите или лишний напишите, то программа просто не будет работать.

Вкладка Stack/Heap Sizes (размеры стека и кучи)
Параметры говорящие сами за себя.
Стек нужен для передачи параметров функциям, сохранения точек возврата из них и т.д. Сильно большим его делать не имеет смысла т.к. зря будет расходоваться ОЗУ, а если сделать сильно маленьким, то может не хватить (особенно если будет использоваться много вложенных функций). Поставим его равным 0x200 т.е. 512 байт. В нашем проекте этого более чем достаточно.
Куча – это часть ОЗУ выделенная для функций работы с памятью языка С/С++ таких как malloc, оператор new и т.д. В данном проекте мы их использовать не планируем, поэтому ставим 0.

Все, нажимаем кнопочку Save.

В остальных вкладках категории Linker настраиваются подключаемые внешние библиотеки, пути к ним, настройка имени выходного файла, настройки генерации листингов, расчета контрольных сумм и т.д. Нам в данном проекте ничего из этого не понадобиться, а объяснять все слишком долго. Будут конкретные вопросы — спрашивайте в комментах.

Категория Debuger (отладчик)
Здесь настраиваются аппаратные средства внутрисхемной отладки либо отладка в симуляторе. Как я уже говорил, аппаратных средств у меня нет, а симулятором я не пользуюсь. Поэтому рассказать тут особо ничего не могу.

С облегчением жмем кнопку Ок справа-внизу окошка, и применяем выбранные параметры.

Теперь можно смело нажать кнопку F7 или в меню

 Project->Make

и откомпилировать наш проект.

В папочке которую вы указали для выходных файлов программы (если ничего не меняли, то это будет, в зависимости от выбранной конфигурации, папка Debug/exe либо Release/exe в папке с проектом) увидим 2 файла. Один с раширением .out и второй .bin или .hex, в зависимости от того, что вы указали в качестве дополнительного выходного файла.

Все, наша первая программа готова! Можно прошивать ее в контроллер и она заработает! Не верите? А вы попробуйте.

На этом позвольте закончить мою первую статью т.к. она и так получилась не маленькой. А к написанию более функционально насыщенной программы мы перейдем на следующем нашем шаге.

PS:
Хочу еще пару слов сказать о прошивке контроллера. Как я написал в эпиграфе, если ничего нет, но очень хочется… Если у вас нет аппаратного прошивальщика и/или отладчика, то это не большая проблема. Дело в том, что прошить контроллер STM32F можно с использованием обычного интерфейса USART, в простонародье это называется через COM порт. В идеале, если на плате с микроконтроллером распаян преобразователь уровней USART в TTL и заведен на порт USART1 контроллера (ножки PA.8 PA.9). Если нет, то тоже не большая беда. Можно немного распотрошить любой кабель-переходник USB<->COM (в крайнем случае покупается в магазине), там внутри стоит микросхема с TTL уровнями, и пользоваться им подключаясь напрямую к ножкам контроллера. Про выставление уровней BOOT0/1 и как входить в режим бутлоадера можно узнать из даташита. А прошивать можно программой Flash Loader Demo производства самой ST Microelectronics. Я пользуюсь именно ей. Правда почему-то найти ее на сайте ST невозможно, поэтому прикладываю ее к своей статье, спасибо за нее нашим китайским братьям!

41 thoughts on “ARM. Учебный курс. IAR EWARM. Создание проекта.”

      1. вроде бы для всех кроме STM32F100xx. Под виндой у меня таки не получилось прошить, но под линуксом с помощью dfu-util работает. Для LPC17xx еще проще — можно прошивать через USB со специальным secondary bootloader’ом, который монтирует контроллер как Mass Storage Device. Под виндой и под линуксом работает;)

    1. Не надо напрасно вводить людей в искушение :-)
      Из чтения даташита становится ясно, что «In connectivity line devices the boot loader can be activated through one of the following interfaces: USART1, USART2 (remapped), CAN2 (remapped) or USB OTG FS in Device mode (DFU: device firmware upgrade).»
      Т.е. это справедливо только для «connectivity line devices», которые как бы не совсем для широких масс предназначены…
      Правда есть ещ вариант прошить свой бутлоадер понимающий USB и пользоваться дальше им (вроде есть такие), но его нужно будет прошивать всеравно через USART или JTAG.

      1. 105-ю серию можно купить за 200 рублей — не намного дороже чем 103-я. Не думаю, что вообще кто-то использует ARM для своих «бюджетных» проектов.

  1. > MISRA-C: 2004 и MISRA-C: 1998. Настройки расширений MISRA-C. Что это такое, я честно не знаю. :-)

    MISRA-C — это скорее не расширения, а ограничения :) Точнее, это набор правил для программирования на C, установленный MISRA — Motor Industry Software Reliability Association (http://en.wikipedia.org/wiki/MISRA ) — ассоциацией по безопасности автомобильного ПО. Правила довольно строгие, например, запрещено использовать side effects в условиях if и циклов.

    Если эта опция включена, то компилятор будет ругаться на нарушения этих правил.

      1. Какой есть :) Я тоже со многими вещами в нем не вполне согласен, хоть и знаю, что нарушение этих правил часто приводит к ошибкам.

        В принципе, половину программ из книжки Кернигана и Ритчи MISRA забраковала бы.

  2. Если GCC почему же сразу линукс :) прекрасно пишу на нём и под виндой AVR, ARM…
    Редактор «убогий» у иара, и цена не подъемная так как за каждую платформу просят мани :( а так хороший по коду. Но и гцц не сильно от него отстает…

    1. Под ГЦЦ емнип работает CoIDE от coocox.com и дружит с ColinkEX (что естественно). На базе эклипса. Про нее чтоль тоже написать :) Хотя там все тривиально.

    1. Я плотно сижу на Keil Владимир ака rtxonair на IAR так что скорей всего, если Владимир будет выдавать какие-либо примеры, то я их буду попутно и на Keil портировать. А вот в обратную сторону (т.е. если я напишу пример под Кейл) это уже зависит от него. Захочет — добавит в статью порт под иар.

    2. Если запал не иссякнет, то я планирую еще ряд статей по STM32F + EWARM.
      Если у народа есть интерес, то могу и проекты DI HALT’а портировать…
      На самом деле дальше все будет в принципе прозрачно от используемой IDE.
      Различия вылазят на нетривиальных проектах, если нужно будет в ASM код инициализации залезть или свои сегменты памяти/данных прописывать и т.д.

      1. Спасибо DI HALT и rtxonair за статьи с двумя IDE. На данный момент интересен Keil, а дальше чем черт не шутит)

  3. Вопрос: а нельзя просто писать код в любом текстовом редакторе и компилировать через ARM GCC? Если отладка мне не нужна, есть ли с таким подходом какие-нибудь грабли или нерешаемые/труднорешаемые проблемы? естественно, надо библиотеки с define’ами для конкретного МК, да вроде бы и всё…

    1. Конечно можно! Граблей никаких нет! В принципе, даже библиотеки с дефайнами не нужны… Они лишь жизнь облегчают. По минимуму нужен лишь компилятор, линковщик, даташит на микроконтроллер и руки с малым радиусом кривизны… ;-)
      Я, например, когда на PIC’ах игрался, так и делал. Код писал в FAR’е а компилировал самописным батником… Почему уже и не помню, но так проще было.

    2. про руки с малым радиусом кривизны — наверное, наоборот, с большим :)

      как куплю контроллер — с ARM GCC попробую разобраться.

    3. Все верно написали. Разные IDE интересны в основном с точки зрения наличия отладчиков, симуляторов и тому подобных фишечек, которые сильно облегчают жизнь. А текст писать можно в чем угодно (Ну в Word-е наверное не стоит ;) ).

    4. Первый раз я под LPC1768 использовал EXpresso (или как то так) только что бы убедиться в правильности работы платы, а потом уже стал работать на связке Eclipse + GCC(Yagarto). Так что всё можно :)

      1. большое спасибо за статью!
        Ребята не могли бы вы написать статью про eclipse+gcc в идеале под linux gentoo. Я очень хочу с этим разобраться.
        У меня в распоряжении LPC1114+нелегальная копия J-Link благодаря этой статье с отладкой и прочим в IARe разобрался, но eclipse кажется привлекательнее.

        Конкретная проблема при использовании EXpresso в том что при нажатии кнопки Program Flash появляется сообщение : No emulator or board available. хотя IAR всё прекрасно видит. Собственно не понимаю где EXpresse сказать что я использую J-Link?

        ZiB не мог бы ты оставить своё мыло для кратковременных консультаций по eclipse.

          1. Не шил я первое время по ком порту :) (по моему утилитой FlashMagic) это уже потом через JTAG. А еxpreeso ставил только код писать, там же бльшая часть на автомате. Eclipse только как редактор юзаю, но чем смогу помогу пиши zib(собачка)ziblog.ru

  4. Добрый день всем! Наткнулся на плату STM32VLDISCOVERY, на базе STM32F100, это и плата, и программатор одновременно. В той же терре около 500 р стоит, советую обратить внимание

    1. Эту плату получил бесплатно, была акция тут http://www.ebv.com/ru/produkty/stm32-design-contest.html, но вроде уже не высылают…
      НО СЛЕДУЕТ ОБРАТИТЬ ВНИМАНИЕ, что IAR версии ниже 5.50.5 тупит с ST-LINK (он установлен на плате STM32VLDISCOVERY и его можно использовать отдельно) нужен патч можно взять тут https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32VLDiscovery/Attachments/118/patch.rar (внутри описание что и как делать)

  5. По поводу цены на IAR, вспомнил, у нас в конторе хотели его заказать, правда со всякими гуями и ртосом, но емнип, он один стоил не меньше 200к, так что кейл и по деньгам вполне рулит, если всего 3к/б.

  6. какой девайс выбрать во вкладке target, если у меня atmega16 ?
    а еще при компиляции говорит что не знает что такое PORTD DDRD итд.
    и в какой библиотеке можно найти функции _delay_ms() и _delay_us()?

  7. Пишу бутлоадер в Иаре, который мне уже весь мозг вынес. Язык С++. Бутлоадер объединен с другим проектом, поэтому в памяти программ выделено 2 сегмента: один с адреса 0x00000 до 0x1e000 (пространство для основного приложения), второй соответственно с 0x1e000 до конца памяти (это пространство для самого бутлоадера). Проблема в следующем. Дело в том, что когда я использую операторы сдвига впроцедурах, которые находятся в секции бутлоадера, типа:

    [CODE]
    void tempBootloader() @ «BOOTLOADER»
    {
    for (uchar i=0;i<sizeof(length);i++)
    {
    unsigned long length=0;
    unsigned char tempLength=12;

    length|=tempLength<<(8*i); //вот в этом месте начинаются баги
    }
    }
    [/CODE]

    то в дизассемблере видно, что IAR вставляет в эту строку кусок кода, который находится за пределами секции бутлоадера. Выглядит это примерно так:

    [CODE]
    length|=tempLength<<(8*i);
    01E084 8108 LD R16,Y
    01E086 E010 LDI R17,0x00
    01E088 E028 LDI R18,0x08
    01E08A 9E42 MUL R4,R18
    01E08C 2D40 MOV R20,R0
    01E08E 940E 9CEE CALL ?S_SHL_L02
    01E092 2F21 MOV R18,R17
    01E094 0F22 LSL R18
    01E096 0B22 SBC R18,R18
    01E098 2F32 MOV R19,R18
    01E09A 2B80 OR R24,R16
    01E09C 2B91 OR R25,R17
    01E09E 2BA2 OR R26,R18
    01E0A0 2BB3 OR R27,R19
    [/CODE]

    В 6 строке сверху происходит вызов некой подпрограммы ?S_SHL_L02, начало которой берется по адресу 0139DC:

    [CODE]
    ?S_SHL_L02:
    0139DC 954A DEC R20
    0139DE F01A BRMI 0x139E6
    0139E0 0F00 LSL R16
    0139E2 1F11 ROL R17
    0139E4 CFFB RJMP ?S_SHL_L02
    0139E6 9508 RET
    [/CODE]

    А теперь, когда я выполняю стирание страницы, то соответственно стирается и подпрограмма ?S_SHL_L02. Когда я повторно вызываю функцию tempBootloader(), то при выполнении мы снова попадем в ?S_SHL_L02, но на этот раз там уже ничего не будет, только 0xff-фы, т.к. страница то стерлась уже. Вот и все, приехали. Бутлоадеру сорвало крышу.

    Теперь собственно вопрос: Как сделать так, чтобы IAR не вставлял вот такие вставки кода, который выходит за пределы сегмента BOOTLOADER?

    можно конечно, сделать какой-нибудь макрос или инлайн функцию, но это не удобно, т.к. ситуации могут быть разные и для каждой писать что-то новое — не лучший выход. К тому же неизвестно как оно будет компилиться на других машинах.
    Я еще заметил, что иногда компилятор вставляет что-то подобной в начале процедур. Но эта проблема решается, если при ее определении перед именем и типом написать строку __C_task. Что-же касается вставок в середине процедур — я в тупике.

  8. Всем доброго времени суток!
    Несколько недель назад посадили за АРМ. Среда IAR 5.4… Если не туда пишу, прошу прощения, просто не пойму в чем причина моей проблемы, может в настройках.
    Проблема: проект на си… все сделал, но настала пора записи результатов в файл. Вроде, ничего сложного…. fopen(), НО… не создает файл и не находит его даже если ручками создать. В настройках проекта в разделе Library поставил Full… Просто, уже все галочки перетыкал в настройках. Может кто встречался с этой проблемой?

    1. А драйвер файловой системы вам кто будет писать? Саму файловую систему? То что вы там галочки поставили ничего не значит. Ищите FAT библиотеку, привязывайте ее к железу и с ней уже работайте.

  9. Прикрепить CMSIS к IAR не получилось. Пригласите пожалуйста меня кто нибудь в сообщество easyelectronics.ru, буду разбираться.

  10. Подскажите что не так с линкером. Сделал все как в данной статье описано. Вот такая ошибка
    вылазит.
    Error[Li005]: no definition for «__iar_program_start» [program entry]
    Error while running Linker
    Как исправить ?

  11. Подскажите что не так с линкером. Сделал все как в данной статье описано. Вот такая ошибка
    вылазит.
    Error[Li005]: no definition for «__iar_program_start» [program entry]
    Error while running Linker
    Как исправить ?

    связана с отключением Project -> Option -> GeneralOption -> LibraryConfig -> Library -> Normal (стоял None) вызвало ошибку

Добавить комментарий

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha