Jump to content

    
Sign in to follow this  
Neo_Matrix

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

Recommended Posts

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

#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
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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this