Полная версия этой страницы:
Keil + ассемблер
Пожалуйста, помогите создать новый пустой проект на ассемблере для камешка STM32. В среде Keil.
Два дня потратил в поисках рабочего примера.. Вроде, пустой проект создаётся. Это я и сам смог сделать. Ну как обычно, в начале идёт таблица прерываний. Дальше код. Хорошо, это всё компилируется, разобрался. Но не могу подключить файлик stm32f10x.h вот в чём дело..
Пишу #include "stm32f10x.h" - ошибка ...
А без него-то никак!
toweroff
Nov 29 2010, 18:59
Цитата(LWW @ Nov 29 2010, 21:45)

Пожалуйста, помогите создать новый пустой проект на ассемблере для камешка STM32. В среде Keil.
Два дня потратил в поисках рабочего примера.. Вроде, пустой проект создаётся. Это я и сам смог сделать. Ну как обычно, в начале идёт таблица прерываний. Дальше код. Хорошо, это всё компилируется, разобрался. Но не могу подключить файлик stm32f10x.h вот в чём дело..
Пишу #include "stm32f10x.h" - ошибка ...
А без него-то никак!
а как вообще подключить сишный хидер к асмовому проекту?
Упс.. А что, бывают разные хидеры?
Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"
и всё работает. Правда в keil никогда до этого не пробовал. Но маленький проектик на C - создаётся, компилируется. А надо на ассемблере..
toweroff
Nov 29 2010, 21:20
Цитата(LWW @ Nov 29 2010, 22:38)

Упс.. А что, бывают разные хидеры?
Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"
и всё работает. Правда в keil никогда до этого не пробовал. Но маленький проектик на C - создаётся, компилируется. А надо на ассемблере..
чисто на асме не делал, но синтаксис-то языков, уж простите, разный
Мдааа... Перекопал я всё, перекопал, и понял. Заголовочгый файл для АСМа придётся сделать ручками, из сишного варианта. Напрямую прикрутить его к АСМ-проекту нельзя. В принципе это не очень сложно, просто назначить мнемоники и соотв. им цифры.
Хотя странно. В том же IAR, для асемблера под 8bit NEC я использую заголовочный файл на Си. И всё работает.
До какой же степени всё запущено... АСМ вообще практически не поддерживается в среде АРМ-процессоров. Ни хороших примеров, ни заголовочного файла тебе..
Удивительно
Ведь именно АРМ, а в особенности новый Cortex - рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....
firstvald
Nov 29 2010, 22:41
Цитата(LWW @ Nov 30 2010, 01:30)

- рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....
Это чистое искусство, а как до прозы доходит - написать прогу хотябы простейшую, чтобы пару плавающих чисел умножала, так рай заканчивается.
ой.. да ладно..
esaulenka
Nov 30 2010, 15:38
Цитата(LWW @ Nov 29 2010, 22:38)

Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"
и всё работает.
Это хитрая фича IAR'овского ассемблера, что он понимает синтаксис Си-файлов.
Все остальные ассемблеры, которые я видел, слово "#define", например, не воспринимают.
Цитата(LWW @ Nov 30 2010, 01:30)

Ведь именно АРМ, а в особенности новый Cortex - рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....
Да где же Вы рай то нашли?
Машинный код в ARM заточен под C в ущерб эффективности на ASM.
Именно поэтому код на C практически не проигрывает коду на ASM.
Кстати, писать чистую ASM прогу неудобно.
Намного удобнее писать на C а отдельные критические куски в виде функций
на ASM. В которых можно использовать Сишные переменные и константы.
Тут самое сложное - разобраться, как производится передача параметров в Смшную функцию.
Благодаря такому вот взгляду на возможности ассемблера и потенциал 32-битной архитектуры и производятся сейчас глючные тормознутые телефоны с процессорами на 600мГц.
LWWИменно,
благодаря такому вот взгляду на возможности ассемблера мы имеет такое многообразие телефонов (смартфонов, ebook'ов и прочих гаджетов) за очень небольшие деньги.
Использование ассемблера для ARM имеет смысл только в очень узком круге задач, где экономия в 3-4 команды в функции, даст выигрыш 5-10 % общей производительности.
Кстати, имеет смысл
почитать.
Цитата(ASN @ Dec 9 2010, 21:23)

LWWИменно,
благодаря такому вот взгляду на возможности ассемблера мы имеет такое многообразие телефонов (смартфонов, ebook'ов и прочих гаджетов) за очень небольшие деньги.
Использование ассемблера для ARM имеет смысл только в очень узком круге задач, где экономия в 3-4 команды в функции, даст выигрыш 5-10 % общей производительности.
Кстати, имеет смысл
почитать.
Есть штуки, которые на C просто не изобразить.
Например запись в кольцевой буфер из регистров r0-r12 значения из внешнего порта.
Ну правильно, разнообразие, многообразие.. Понастряпали всякой недоделанной техники, которая продаётся только для того, что бы сразу захотелось взять другое..
Хотя тут спорить не буду. Осей не писал и не могу знать, можно ли написать тот же линукс на ассемблере, когда камни так часто меняются.
Хехех.. В работе на младшеньких ARM линукса не видел, но уже представил, какой он тормозячий... Если даже на пнях помню как-то, поставил линукс, так думал что при этой жизни вообще не дождусь результатов его деятельности..
Нужно не камни менять, а программы грамотно писать. Тогда и код переписывать, раз в 25 лет придётся, не чаще.
toweroff
Dec 9 2010, 21:07

Чойта я сразу вспомнил старый добрый ZX-Spectrum
Да-да... И я его хорошо помню. Особенно блок питания 5В 1А, который заменял калорифер с небольшом помещении.
Но времена-то меняются. А для Z80 я писал на ассемблере такие вещи, что знатоки поражались. Правда до ума их так и не доводил, маленький был..
В качестве примераВ начале статьи описана конфигурация железа.
А дальше просто анекдот, что на этом железе сотворили несколько сотен или тысяч человек и те несколько миллиардов-триллионов-квадриллионов долларов, которые были вложены в разработку аппарата

Готов поверить, что аппаратная начинка сама по себе очень надёжная. Железки делать научились, такой агрегат может проработать сотню лет, выполняя возложенные на него функции. Этого и боятся..
Как в keil для cortex m4 на ассемблере указать адрес flash памяти с которой начинают записываться (не исполняться) команды. До этого работал только с 8бит avr, там было ".org 0x0100"
Попробовал и здесь через ORG
Код
STACK_TOP EQU 0x20009FFF
PRESERVE8
THUMB
AREA RESET, CODE, READONLY
DCD STACK_TOP
DCD Start
ORG 0x08000200
nop
ENTRY
nop
Start
add r10, r10, #0x00000FFF
B Start
END
Выдал ошибку, что ORG не неизвестен (error: A1163E: Unknown opcode ORG , expecting opcode or Macro). Без строки "ORG 0x08000200" программа работает, но с адреса 0x0800000C.
esaulenka
Nov 15 2013, 19:10
Можно просто сместить AREA RESET:
- вариант простой: Options for Target -> Target, поправить адреса начала ROM
- вариант посложнее: снять галку "брать настройки линкера из настроек target", дописать руками scatter-файл (кейл делает заготовку, в несложных случаях можно понять, что там и как, даже без документации).
При необходимости можно сделать несколько AREA, но тогда уж точно простой способ не поможет.
Вообще, для ARMов обычно используется скрипт компоновщика, в котором прописываются адреса всех секций (AREA) и т.п. вещи.
Цитата(esaulenka @ Nov 15 2013, 22:10)

Можно просто сместить AREA RESET
я не совсем корректно написал, смещать хочу не всю AREA, а задавать адрес меток
Цитата(esaulenka @ Nov 15 2013, 22:10)

При необходимости можно сделать несколько AREA
можете подсказать, как для AREA задать адрес в коде программы без scatter-файла с которого секция начинается?
Цитата(SII @ Nov 16 2013, 10:56)

Вообще, для ARMов обычно используется скрипт компоновщика, в котором прописываются адреса всех секций (AREA) и т.п. вещи.
scatter-файл? примеры под конкретные ядра существуют?
Цитата(ЭнСб @ Nov 16 2013, 21:16)

можете подсказать, как для AREA задать адрес в коде программы без scatter-файла с которого секция начинается?
Кажется, это невозможно.
Цитата
scatter-файл? примеры под конкретные ядра существуют?
Эти файлы всегда генерируются сами Кейлом, если настройку памяти осуществлять его средствами. Кроме того, они достаточно подробно описаны в документации. Зависят они не от ядер, а от моделей процессоров, поскольку распределение памяти к ядрам отношения не имеет. Вот у меня под NXP LPC1788:
Код
CODE_IMAGE 0x00000000 ABSOLUTE NOCOMPRESS
{
STARTUP +0
{
*.o (RESET)
}
KINIT +0 ALIGN 4
{
*.o (KINIT)
}
KERNEL +0 ALIGN 4
{
*.o (KERNEL)
}
KDRIVERS +0 ALIGN 4
{
*.o (KDRIVERS)
}
KERNEL_STRINGS +0 ALIGN 4
{
*.o (KERNEL_STRINGS)
}
}
DATA_IMAGE +0 ALIGN 8 NOCOMPRESS
{
KDATA 0x10000000 ALIGN 8
{
Kernel_Data.o (KDATA)
}
KBLOCKS +0 ALIGN 8
{
*.o (KBLOCKS)
}
SQA +0 ALIGN 8
{
*.o (SQA)
}
KSTACK +0 ALIGN 8
{
*.o (KSTACK)
}
}
COMMON_PARTITION 0x00010000 ALIGN 8 NOCOMPRESS
{
TASK_CODE 0x00010000 ALIGN 4
{
*.o (.text)
*.o (.rodata)
}
}
TASK_PARTITION +0 ALIGN 8 NOCOMPRESS
{
TASK_INI_DATA 0x10008000 ALIGN 8
{
*.o (.data)
}
TASK_NOINI_DATA +0 ALIGN 8
{
*.o (.bss)
}
TASK_HEAP +0 ALIGN 8 EMPTY 1024
{
}
}
toweroff
Nov 17 2013, 07:44
Цитата(ЭнСб @ Nov 16 2013, 21:16)

можете подсказать, как для AREA задать адрес в коде программы без scatter-файла с которого секция начинается?
скаттер либо используется ваш, либо генерится и используется исходя из заданных в красивых окошках значений
Цитата(ЭнСб @ Nov 16 2013, 21:16)

scatter-файл? примеры под конкретные ядра существуют?
скачайте документацию на линкер
там все разжевано досконально
Спасибо за ответы, буду разбираться со скриптами. Для оставления пустого пространства с помощью команд в ассемблере нашел только SPACE и FILL, например " FILL 0x10, 0xBF00, 2" вроде заполняет пустыми командами (nop).
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.