Jump to content

    

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

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites

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

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

 

Quote

#define MAGIC_NUM 0x568978

 

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

 

 

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

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

 

Share this post


Link to post
Share on other sites

Собственно вопрос был не по 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

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

Share this post


Link to post
Share on other sites

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

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

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

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

#define DCD

const magic_number =

#include "magic.s"

4) Профит.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
42 minutes ago, scifi said:

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

...

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

35 minutes ago, ViKo said:

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

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

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

#include "c_header.h"

DCD MAGIC_NUM

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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 не подходит, так как создает переменную инициализированную нулем.

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now