Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil + ассемблер
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
LWW
Пожалуйста, помогите создать новый пустой проект на ассемблере для камешка STM32. В среде Keil.

Два дня потратил в поисках рабочего примера.. Вроде, пустой проект создаётся. Это я и сам смог сделать. Ну как обычно, в начале идёт таблица прерываний. Дальше код. Хорошо, это всё компилируется, разобрался. Но не могу подключить файлик stm32f10x.h вот в чём дело..

Пишу #include "stm32f10x.h" - ошибка ...

А без него-то никак!
toweroff
Цитата(LWW @ Nov 29 2010, 21:45) *
Пожалуйста, помогите создать новый пустой проект на ассемблере для камешка STM32. В среде Keil.

Два дня потратил в поисках рабочего примера.. Вроде, пустой проект создаётся. Это я и сам смог сделать. Ну как обычно, в начале идёт таблица прерываний. Дальше код. Хорошо, это всё компилируется, разобрался. Но не могу подключить файлик stm32f10x.h вот в чём дело..

Пишу #include "stm32f10x.h" - ошибка ...

А без него-то никак!

а как вообще подключить сишный хидер к асмовому проекту? 07.gif
LWW
Упс.. А что, бывают разные хидеры?

Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"

и всё работает. Правда в keil никогда до этого не пробовал. Но маленький проектик на C - создаётся, компилируется. А надо на ассемблере..
toweroff
Цитата(LWW @ Nov 29 2010, 22:38) *
Упс.. А что, бывают разные хидеры?

Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"

и всё работает. Правда в keil никогда до этого не пробовал. Но маленький проектик на C - создаётся, компилируется. А надо на ассемблере..

чисто на асме не делал, но синтаксис-то языков, уж простите, разный laughing.gif
LWW
Мдааа... Перекопал я всё, перекопал, и понял. Заголовочгый файл для АСМа придётся сделать ручками, из сишного варианта. Напрямую прикрутить его к АСМ-проекту нельзя. В принципе это не очень сложно, просто назначить мнемоники и соотв. им цифры.

Хотя странно. В том же IAR, для асемблера под 8bit NEC я использую заголовочный файл на Си. И всё работает.

До какой же степени всё запущено... АСМ вообще практически не поддерживается в среде АРМ-процессоров. Ни хороших примеров, ни заголовочного файла тебе..

Удивительно laughing.gif

Ведь именно АРМ, а в особенности новый Cortex - рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....
firstvald
Цитата(LWW @ Nov 30 2010, 01:30) *
- рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....


Это чистое искусство, а как до прозы доходит - написать прогу хотябы простейшую, чтобы пару плавающих чисел умножала, так рай заканчивается.
LWW
ой.. да ладно.. rolleyes.gif
esaulenka
Цитата(LWW @ Nov 29 2010, 22:38) *
Я в IAR подключаю хидер для NEC 8-битника
#include "io78f9212.h"
и всё работает.

Это хитрая фича IAR'овского ассемблера, что он понимает синтаксис Си-файлов.
Все остальные ассемблеры, которые я видел, слово "#define", например, не воспринимают.
vallav
Цитата(LWW @ Nov 30 2010, 01:30) *
Ведь именно АРМ, а в особенности новый Cortex - рай для ассемблерщика! Какой роскошный набор команд! Да при таких частотах, с такой периферией, из ушей лезет....


Да где же Вы рай то нашли?
Машинный код в ARM заточен под C в ущерб эффективности на ASM.
Именно поэтому код на C практически не проигрывает коду на ASM.

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


Есть штуки, которые на C просто не изобразить.
Например запись в кольцевой буфер из регистров r0-r12 значения из внешнего порта.

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

Хотя тут спорить не буду. Осей не писал и не могу знать, можно ли написать тот же линукс на ассемблере, когда камни так часто меняются.

Хехех.. В работе на младшеньких ARM линукса не видел, но уже представил, какой он тормозячий... Если даже на пнях помню как-то, поставил линукс, так думал что при этой жизни вообще не дождусь результатов его деятельности..

Нужно не камни менять, а программы грамотно писать. Тогда и код переписывать, раз в 25 лет придётся, не чаще.
toweroff
bb-offtopic.gif Чойта я сразу вспомнил старый добрый ZX-Spectrum sm.gif
LWW
Да-да... И я его хорошо помню. Особенно блок питания 5В 1А, который заменял калорифер с небольшом помещении.

Но времена-то меняются. А для Z80 я писал на ассемблере такие вещи, что знатоки поражались. Правда до ума их так и не доводил, маленький был.. cool.gif
LWW
В качестве примера

В начале статьи описана конфигурация железа.

А дальше просто анекдот, что на этом железе сотворили несколько сотен или тысяч человек и те несколько миллиардов-триллионов-квадриллионов долларов, которые были вложены в разработку аппарата 01.gif

Готов поверить, что аппаратная начинка сама по себе очень надёжная. Железки делать научились, такой агрегат может проработать сотню лет, выполняя возложенные на него функции. Этого и боятся..
ЭнСб
Как в 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
Можно просто сместить AREA RESET:
- вариант простой: Options for Target -> Target, поправить адреса начала ROM
- вариант посложнее: снять галку "брать настройки линкера из настроек target", дописать руками scatter-файл (кейл делает заготовку, в несложных случаях можно понять, что там и как, даже без документации).

При необходимости можно сделать несколько AREA, но тогда уж точно простой способ не поможет.
SII
Вообще, для 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-файл? примеры под конкретные ядра существуют?
SII
Цитата(ЭнСб @ 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 16 2013, 21:16) *
можете подсказать, как для AREA задать адрес в коде программы без scatter-файла с которого секция начинается?

скаттер либо используется ваш, либо генерится и используется исходя из заданных в красивых окошках значений

Цитата(ЭнСб @ Nov 16 2013, 21:16) *
scatter-файл? примеры под конкретные ядра существуют?

скачайте документацию на линкер
там все разжевано досконально
ЭнСб
Спасибо за ответы, буду разбираться со скриптами. Для оставления пустого пространства с помощью команд в ассемблере нашел только SPACE и FILL, например " FILL 0x10, 0xBF00, 2" вроде заполняет пустыми командами (nop).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.