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

Портирование uCOS под CrossWorks

Кто-нибудь портировал uCOS под CrossWorks? Если да, подскажите, как в этой среде сделать, чтобы CrossWorks понимала PRIMASK, PSP и другие специальные регистры. И вообще, откуда взялись ошибки типа

STM R0, {R4-R11} Io register required

LDM R0, {R4-R11} Io register required

POP {R14} unvalid register list to push/pop instruction (при этом команда PUSH {R14} прошла без вопросов)

ORR LR, LR, #0x04 unshifted register required

Ассемблерные команды вроде бы правильные, соответствуют архитектуре Cortex, но...

Отзовитесь, плиз.

Пожалуйста, не удаляйте эту тему.

Изменено пользователем Lemist

Поделиться сообщением


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

Поищите в этом проекте. Во всяком случае компилироваться должно без ошибок.

http://www.alylab.eu/OpenProjects/ARMDomin...RMDominator.htm

Поделиться сообщением


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

Поищите в этом проекте. Во всяком случае компилироваться должно без ошибок.

http://www.alylab.eu/OpenProjects/ARMDomin...RMDominator.htm

 

Спасибо за ссылку, но проект сделан не под процессор типа Cortex. Да, тот демо-проект скомпилировался без ошибок, но применить его не удалось - там все ассемблерные команды ARM, но не Thumb-only processor, каковым - уточняю - является LPC1758 с ядром Cortex. Так что портирование не удалось.

Поделиться сообщением


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

Спасибо за ссылку, но проект сделан не под процессор типа Cortex. Да, тот демо-проект скомпилировался без ошибок, но применить его не удалось - там все ассемблерные команды ARM, но не Thumb-only processor, каковым - уточняю - является LPC1758 с ядром Cortex. Так что портирование не удалось.

Тут смотрел? Упоминается конкретно M3.

Поделиться сообщением


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

Тут смотрел? Упоминается конкретно M3.

 

Это сайт Micrium, там по указанной ссылке так просто не попасть - предлагают зарегистрироваться. Все бы ничего, но в процедуре регистрации имеется комбо со списком Target Processor. Так вот, в этом списке НЕТ Cortex, а где же он тогда по этой ссылке упоминается конкретно? Я просто наверняка не пройду регистрацию, потому что не нашел там Cortex. Может, плохо смотрел (хотя два раза и внимательно)?

Поделиться сообщением


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

И главная проблема в компиляции проектов под CrossWorks, так и осталась за кадром.

Дело вот в чем: если при настройке под синтаксис CrossWorks указать директиву

.code 32

то CrossWorks просто весь последующий код понимает как набор ARM-инструкций и на каждую строку ругается примерно так:

Error: attempt to use an ARM instruction on a Thumb-only processor -- `bx LR'

А если указать директиву

.code 16

выдается сообщение другого вида:

C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.7/gcc/bin/ld: region UNPLACED_SECTIONS is full (THUMB Flash Debug/LPC1756_Test.elf section .code)

В то же время в datasheet на Cortex (конкретно это микроконтроллер LPC1758) нет никаких указаний, что ARM-инструкции запрещены - они там расписаны, как положено. Впечатление такое, что в CrossWorks где-то есть фича, которую можно установить, и CrossWorks будет все понимать. Но я пока такую фичу НЕ НАШЕЛ. А пока она не установлена, ARM-инструкции для CrossWorks останутся persona non grata, хотя это неправильно.

Есть ли выход из этой ситуации?

Поделиться сообщением


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

А вы не пробовали вообще не указывать директивы вроде code16 или code32? Cortex - то ведь thumb-only процессор, у него один-единственный набор команд, следовательно и необходимость подобных директив отпадает.

В даташите на процессор под ARM-инструкциями для LPC17xx понимаются существующие 32-разрядные инструкции, но на самом деле они лежат в одном наборе с 16-разрядными под общим названием Thumb-2 и не требуют особого объявления. Есть, конечно, такие команды как LDR.N (16 бит) и LDR.W (32 бит), но это уже, скорее, тема для иного разговора, если интересно, можете почитать о них в документации.

Поделиться сообщением


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

А вы не пробовали вообще не указывать директивы вроде code16 или code32? Cortex - то ведь thumb-only процессор, у него один-единственный набор команд, следовательно и необходимость подобных директив отпадает.

В даташите на процессор под ARM-инструкциями для LPC17xx понимаются существующие 32-разрядные инструкции, но на самом деле они лежат в одном наборе с 16-разрядными под общим названием Thumb-2 и не требуют особого объявления. Есть, конечно, такие команды как LDR.N (16 бит) и LDR.W (32 бит), но это уже, скорее, тема для иного разговора, если интересно, можете почитать о них в документации.

 

Если не указывать никакой директивы "вроде code16 или code32", эффект тот же, как и при указании code16 - ассемблерный файл компилится, а потом при линковании выпадают все те сообщения, что упомянуты у меня в предыдущей реплике:

C:/Program Files/Rowley Associates Limited/CrossWorks for ARM 1.7/gcc/bin/ld: region UNPLACED_SECTIONS is full (THUMB Flash Debug/LPC1756_Test.elf section .code)

Что это за region UNPLACED_SECTIONS и чем это он забит? Ведь в компилируемом ассемблерном файле четко указано

.section .code, "ax"

то есть это именованная секция.

Поделиться сообщением


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

Просмотрев help на CrossWorks, я вызвал в UltraEdit файл flash_placement.xml и добавил в него строку: <ProgramSection alignment="4" load="Yes" inputsections="*(.code .code.*)" name=".code"/>

После этого линковщик перестал выдавать сообщение "region UNPLACED_SECTIONS is full", но остальные ошибки с предупреждением dangerous error остались. Все они одного вида - first occurrence: THUMB Flash Debug/os_cpu_c.o: thumb call to arm. И касаются они как правило двух вещей в этих модулях - OS_ENTER_CRITICAL(); и OS_EXIT_CRITICAL(); - это запрещение и разрешение прерываний - и идут попарно.

Что линковщику нужно?

Поделиться сообщением


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

Все то, о чем я писал ранее, относилось к CrossWorks 1.7. После инсталляции CrossWorks 2.0 (версия evaluation) вся эта масса сообщений перешла в категорию warnings, но линкование так и не состоялось - вывалились две ошибки линковщика о неопределенных символах __stack_process_start__ и __stack_process_end__. Очевидно,их нужно куда-нибудь добавить и сформировать стек процесса. Но меня беспокоит не это, а вся эта масса - то, что они стали warnings, вовсе не уменьшило их потенциальной опасности. Так что CrossWorks для меня потеряно... :(

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...