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

    

Использование #define значения в ASM KEIL

В заголовочном СИ файле определено:
 

#define MAGIC_NUM 0x568978

const magic_number = MAGIC_NUM;

Эта переменная используется в Си коде проекта. Но еще эту переменную нужно прикрутить в конец таблицы векторов прерываний.

Попробовал сделать так в стартап файле:

EXTERN    magic_number[DATA]

... ; Здесь находится таблица прерываний.

DCD        magic_number ; Добавил в конец таблицы.

 

Так вот, после компиляции в конце таблицы прерываний размещается адрес переменной magic_number, а не само значение этой переменной.

Можно ли сделать, что бы по этому адресу находилось именно значение, может значение СИшного #define можно использовать?

Варинт с :

DCD 0x568978

не рассматриваю, так как нужно помнить о замене 2х переменных.

Среда KEIL для ARM.

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

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


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

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

Достаточно лишь добавить эту строку в некий h-файл, а сам этот файл добавлять во нужные c/cpp исходники (через соотв. include).

 

Quote

#define MAGIC_NUM 0x568978

 

У меня такой файл называется GlobalSettings.h

 

 

Если же вам принципиально нужно разместить некую переменную (или константу) по некому адресу, то задача эта весьма обсосанная и есть в мануале на keil.

Способы реализации зависят от версии компилятора.

 

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


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

Собственно вопрос был не по include в необходимые файлы .c .cpp. Суть вопроса в присвоении значения СИшного #define ассемблерной переменной, размещенной в конце таблицы прерываний.

И да сейчас сделано так:
 

#define MAGIC_NUM 0x568978

const uint32_t magic_num __attribute__((section(".ARM.__at_0x08000188"))) = MAGIC_NUM;

У этого подхода есть большой косяк, в случае смещения прошивки по флешу(допустим версия DEBUG которая стартует с начала адреса флеша и версия PROD, которая стартует со второго сектора флеша) нужно не забывать изменять значение адреса, или писать конструкции типа:
 

#if DEBUG

...

#else

...

#endif

При этом таблица прерываний смещается сама, в зависимости от выбраного СКАТЕР файла, по этому хотелось более изящьного решения.

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


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

Предлагаю многоходовочку.

1) Создаём файл magic.s, содержащий "DCD 0x568978 ;"

2) В ассемблерном файле в нужном месте пишем "GET magic.s"

3) В сишном файле пишем

#define DCD

const magic_number =

#include "magic.s"

4) Профит.

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


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

Там, если не ошибаюсь, всё решается волшебным словом EXTERN. Но я не смог найти, где обсуждалось.

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


Ссылка на сообщение
Поделиться на другие сайты
42 minutes ago, scifi said:

Предлагаю многоходовочку.

...

Да, вполне неплохой вариант, затягивать переменную из ASM в С, а не на оборот. Спасибо

35 minutes ago, ViKo said:

Там, если не ошибаюсь, всё решается волшебным словом EXTERN. Но я не смог найти, где обсуждалось.

Про EXTERN писал в первом сообщении, при таком подходе в нужную ячейку кладется не сама переменная, а адрес по которому переменная расположена.

EXTERN напрямую на СИшный #define натравить не получается, при компиляции выдает ошибку.

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


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Neo_Matrix сказал:

Про EXTERN писал в первом сообщении, при таком подходе в нужную ячейку кладется не сама переменная, а адрес по которому переменная расположена.

EXTERN напрямую на СИшный #define натравить не получается, при компиляции выдает ошибку.

Пардон, не EXTERN, а EXPORT в s. файле.

Вот нашел тему:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=98111&page=7&tab=comments#comment-1324945

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


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

А что, препроцессор кейловского асма не понимает обычные #define? Если понимает, то почему не сделать тупо

#include "c_header.h"

DCD MAGIC_NUM

И гцц и Иар такое прекрасно кушают, ибо используют сишный препроцессор перед ассемблированием. 

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


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

Складывается впечатление, что автор вместо простых и очевидных решений предпочитает раскладывать себе грабли, причем, на довольно ровном месте :\

 

Даже стало интересно понаблюдать, чем все это закончится :)

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


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

1. В ключах Assembler Keil можно прописать --cpreproc. Теперь можно прям в file.s писать #include "Settings.h" и делать DCD MY_DEFINE.

2. Не прописывая ключей в file.s пишем GBLA MY_DEFINE, и можно теперь использовать это имя ниже. MY_DEFINE, например, это #define MY_DEFINE 100.

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


Ссылка на сообщение
Поделиться на другие сайты
On 10/18/2018 at 6:10 PM, Forger said:

Складывается впечатление, что автор вместо простых и очевидных решений предпочитает раскладывать себе грабли, причем, на довольно ровном месте :\

 

Даже стало интересно понаблюдать, чем все это закончится :)

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

Закончилось - нечем, по прежнему использую конструкцию:

const uint32_t magic_num __attribute__((section(".ARM.__at_0x08000188"))) = MAGIC_NUM;
On 10/18/2018 at 8:12 PM, Arlleex said:

1. В ключах Assembler Keil можно прописать --cpreproc. Теперь можно прям в file.s писать #include "Settings.h" и делать DCD MY_DEFINE.

2. Не прописывая ключей в file.s пишем GBLA MY_DEFINE, и можно теперь использовать это имя ниже. MY_DEFINE, например, это #define MY_DEFINE 100. 

1) Ключ --cpreproc не поддерживается в 6-й версии компилятора.

2) GBLA не подходит, так как создает переменную инициализированную нулем.

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти