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

Использование #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

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


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

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

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

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

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

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

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

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

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

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