Neo_Matrix 0 17 октября, 2018 Опубликовано 17 октября, 2018 (изменено) · Жалоба В заголовочном СИ файле определено: #define MAGIC_NUM 0x568978 const magic_number = MAGIC_NUM; Эта переменная используется в Си коде проекта. Но еще эту переменную нужно прикрутить в конец таблицы векторов прерываний. Попробовал сделать так в стартап файле: EXTERN magic_number[DATA] ... ; Здесь находится таблица прерываний. DCD magic_number ; Добавил в конец таблицы. Так вот, после компиляции в конце таблицы прерываний размещается адрес переменной magic_number, а не само значение этой переменной. Можно ли сделать, что бы по этому адресу находилось именно значение, может значение СИшного #define можно использовать? Варинт с : DCD 0x568978 не рассматриваю, так как нужно помнить о замене 2х переменных. Среда KEIL для ARM. Изменено 17 октября, 2018 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Создавать глобальный const объект для такой примитивной задачи вовсе не обязательно. Достаточно лишь добавить эту строку в некий h-файл, а сам этот файл добавлять во нужные c/cpp исходники (через соотв. include). Quote #define MAGIC_NUM 0x568978 У меня такой файл называется GlobalSettings.h Если же вам принципиально нужно разместить некую переменную (или константу) по некому адресу, то задача эта весьма обсосанная и есть в мануале на keil. Способы реализации зависят от версии компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Собственно вопрос был не по 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 При этом таблица прерываний смещается сама, в зависимости от выбраного СКАТЕР файла, по этому хотелось более изящьного решения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Предлагаю многоходовочку. 1) Создаём файл magic.s, содержащий "DCD 0x568978 ;" 2) В ассемблерном файле в нужном месте пишем "GET magic.s" 3) В сишном файле пишем #define DCD const magic_number = #include "magic.s" 4) Профит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Там, если не ошибаюсь, всё решается волшебным словом EXTERN. Но я не смог найти, где обсуждалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 42 minutes ago, scifi said: Предлагаю многоходовочку. ... Да, вполне неплохой вариант, затягивать переменную из ASM в С, а не на оборот. Спасибо 35 minutes ago, ViKo said: Там, если не ошибаюсь, всё решается волшебным словом EXTERN. Но я не смог найти, где обсуждалось. Про EXTERN писал в первом сообщении, при таком подходе в нужную ячейку кладется не сама переменная, а адрес по которому переменная расположена. EXTERN напрямую на СИшный #define натравить не получается, при компиляции выдает ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 116 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба А что, препроцессор кейловского асма не понимает обычные #define? Если понимает, то почему не сделать тупо #include "c_header.h" DCD MAGIC_NUM И гцц и Иар такое прекрасно кушают, ибо используют сишный препроцессор перед ассемблированием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Складывается впечатление, что автор вместо простых и очевидных решений предпочитает раскладывать себе грабли, причем, на довольно ровном месте :\ Даже стало интересно понаблюдать, чем все это закончится :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 122 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 1. В ключах Assembler Keil можно прописать --cpreproc. Теперь можно прям в file.s писать #include "Settings.h" и делать DCD MY_DEFINE. 2. Не прописывая ключей в file.s пишем GBLA MY_DEFINE, и можно теперь использовать это имя ниже. MY_DEFINE, например, это #define MY_DEFINE 100. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 4 ноября, 2018 Опубликовано 4 ноября, 2018 (изменено) · Жалоба 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 не подходит, так как создает переменную инициализированную нулем. Изменено 4 ноября, 2018 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться