Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: директивы препроцессора для *.s(asm) файлов в Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
grisha_scorpion
Немного конечно не в тему. Просто не не нашел на форуме про среду разработки Keil.
Подскажите пожалуйста как использовать директивы препроцессора в asm файлах в Keil?
Интересуют такие директивы как #ifdef, #endif и т.д.
scifi
Препроцессор - это для Си. В ассемблере есть аналогичные возможности.
Загляните в мануал.
grisha_scorpion
Цитата(scifi @ Dec 22 2015, 17:01) *
Препроцессор - это для Си. В ассемблере есть аналогичные возможности.
Загляните в мануал.

Спасибо. Но есть еще вопросы.

Допустим есть файл qwe.h:
Код
#define ABS


есть файл asd.s:
Код
      IF :DEF:ABS;проверка объявлен ли ABS
      ......
      ELSE
      .....
      ENDIF


Вопрос: будет ли виден дефайн ABS в файле asd.s? Нужно наверно как то подключить файл qwe.h. Как это сделать?
aaarrr
Цитата(grisha_scorpion @ Dec 22 2015, 20:22) *
Нужно наверно как то подключить файл qwe.h. Как это сделать?

Как и в 'C':
#include "qwe.h"
grisha_scorpion
Цитата(aaarrr @ Dec 22 2015, 20:30) *
Как и в 'C':
#include "qwe.h"

Проверил. Так не катит. Выдает ошибку
aaarrr
Цитата(grisha_scorpion @ Dec 22 2015, 20:37) *
Проверил. Так не катит. Выдает ошибку

Надо еще отдельно через препроцессор протащить. Подробности тут.
На фоне конкурентов довольно "костыльно", конечно.
grisha_scorpion
Цитата(aaarrr @ Dec 22 2015, 20:41) *
Надо еще отдельно через препроцессор протащить. Подробности тут.
На фоне конкурентов довольно "костыльно", конечно.

Может есть что то попроще?


По совету выше сделал вот так в фале asd.s:
Код
     INCLUDE qwe.h
      IF :DEF:ABS;проверка объявлен ли ABS
      ......
      ELSE
      .....
      ENDIF

Но компилятор выдает ошибку:
Код
qwe.h   1   Error: A1167E: Invalid line start

Я думаю это связано с несовместимостью файла qwe.h с ассемблерным форматом.
Предложите еще варианты как все таки сделать так, чтобы в ассемблерном файле можно было контролировать объявление дефайна.
KRS
Цитата(grisha_scorpion @ Dec 23 2015, 11:35) *
Предложите еще варианты как все таки сделать так, чтобы в ассемблерном файле можно было контролировать объявление дефайна.

Собственно говоря использовать IARовский ассемблер, тем более что и тема про IAR
grisha_scorpion
Цитата(KRS @ Dec 23 2015, 13:00) *
Собственно говоря использовать IARовский ассемблер, тем более что и тема про IAR

Я понимаю что тема про IAR, но на форуме я не нашел темы связанной с Keil, что для меня странно.
IARовский компилятор без проблем схавает в ассемберном фалйе такие конструкции как #ifdef, #else, #endif... И я это делаю успешно в IARе. Но у меня сейчас проект использует keilовский компилятор. Переводить все в IAR не хочу по разным причинам.
grisha_scorpion
Цитата(aaarrr @ Dec 22 2015, 20:41) *
Надо еще отдельно через препроцессор протащить. Подробности тут.

Попробовал как в ссылке. Не помогает.
Непомнящий Евгений
Цитата(grisha_scorpion @ Dec 23 2015, 17:32) *
Попробовал как в ссылке. Не помогает.


А чего тут может не помогать? Вам надо отдельно запустить внешний препроцессор, а его выход уже скормить компилятору.
prottoss
Доброго времени суток. Не стал открывать новую тему, так как вопрос про препроцессор ассемблера...Но для IAR.

Тема такая:
Обкатываю собственную библиотеку. Есть несколько плат с предустановленными процессорами STM32F. В опциях компилятора, во вкладке препроцессора задаю тип платы, например OPEN407Z.
Есть файл "board.h" в котором подключаю нужный хидер для целевого варианта проекта. Начало выглядит так:
CODE

/*******************************************************************************
MCU configs
*******************************************************************************/
#if defined OPEN107V /* Defined WaveShare Open107V board */
#define STM32F10X_CL 1 /* Open107V on board target MCU */
#include "stm32f10x.h" /* Link MCU definitions */

#define BOARD_CFG_MCU_HSE_OSC_CLOCK 25000000U /* External quartz clock */

#elif defined OPEN407Z /* Defined WaveShare Open407Z board */
#define STM32F40XX 1 /* Open407Z on board target MCU */
#include "stm32f4xx.h" /* Link MCU definitions */

#define BOARD_CFG_MCU_HSE_OSC_CLOCK 8000000U /* External quartz clock */

#endif

#ifndef __ASSEMBLER__

#include "stdafx.h"

..........

Тут все прекрасно работает. Все драйверы периферии для разных типов МК подключают нужные хедеры и все компилится без ошибок.
Теперь для каждого варианта МК мне нужно подключить ассемблерный стартап. Вот тут затык. В начале *.s фала вставляю вот такой код препроцессора:
CODE

#define __ASSEMBLER__
#include "board.h"

#if defined STM32F40XX

MODULE ?cstartup

............................


Но! После строчки "#if defined STM32F40XX" тело стартапа нифига не компилится!
В чем я ошибаюсь?

Спасибо!
Garmin
Цитата(prottoss @ Feb 1 2016, 17:43) *
для каждого варианта МК мне нужно подключить ассемблерный стартап. Вот тут затык. В начале *.s фала вставляю вот такой код препроцессора:

Мне тоже пришлось повозиться с ассемблерным стартапом в IAR. Но я вышел из положения другим путём: избавился от ассемблерного стартапа совсем. Добавил описание таблицы прерываний в *_it.c файл. Пример для STM32F446 по ссылке:
http://forum.easyelectronics.ru/viewtopic....=428768#p428768
После такого преобразрвания нетрудно написать любые сишные команды препроцессора.
demiurg_spb
Всё это можно через Makefile разрулить...
prottoss
Спасибо за ответыю
Все что сказано выше - понятно. Но, я думал, раз в документации сказано, что препроцессор С поддерживается - можно все сделать так, как сделал я.
drozel
Цитата(Garmin @ Feb 3 2016, 20:02) *
Но я вышел из положения другим путём: избавился от ассемблерного стартапа совсем.

Вот и именно. Вообще не понимаю, откуда растут ноги у ассемблерного стартапа: вроде даже сам ARM поставляет сишный стартап для ядра.
Даже если нет, написать структуру на сях - делов на 20 минут. Заодно обработчики дефолтные можно накидать, используя прелести __weak
scifi
Цитата(drozel @ Feb 5 2016, 13:45) *
Вот и именно. Вообще не понимаю, откуда растут ноги у ассемблерного стартапа: вроде даже сам ARM поставляет сишный стартап для ядра.

Люто плюсую. В открытую была заявлена одна из целей создания Cortex-M: чтобы можно было запрограммировать всё без ассемблера.
А про ноги можно предположить: ARM7TDMI требовал ассемблера, ну а дальше по инерции продолжилось...
prottoss
Цитата(Garmin @ Feb 3 2016, 20:02) *
Мне тоже пришлось повозиться с ассемблерным стартапом в IAR....
Спасибо больше! Идея мне очень понравилась! Очень быстро перевел все проекты с STM32 на "безассемблерную" структуру векторов прерываний. Избавился от кучи файлов. Ушли варнинги (которые немного раздражали) по поводу pubweak - ругался асссемблер. Знаете ли, привык чтобы проект, после компиляции, не выдавал ни каких предупреждений, кроме ОК.

Выкладываю свой вариант стартапа для STM32F10x и STM32F40x. Может кому пригодится.

Интересно - можно ли такое сварганить для других компиляторов? Попробовал сегодня в Keil - но я его не использую и по этому с наскоку не получилось.
demiurg_spb
Цитата(prottoss @ Feb 6 2016, 16:31) *
Код
void HardFault_Handler(void)
{
    __asm volatile
    (
        " tst lr, #4                \n"
        " ite eq                    \n"
        " mrseq r0, msp                \n"
        " mrsne r0, psp                \n"
        " ldr r1, [r0, #24]            \n"
        " b GetRegistersFromStack    \n"
    );
}
Хочу поинтересоваться, для чего нужна предпоследняя строка в Вашей асмовой вставке, если Вы и так в GetRegistersFromStack читаете PC?

Цитата(prottoss @ Feb 6 2016, 16:31) *
Интересно - можно ли такое сварганить для других компиляторов?
Конечно можно.
Я раньше одновременно использовал и KEIL и GCC.
Потом понял, что GCC меня полностью устраивает...
prottoss
Цитата(demiurg_spb @ Feb 8 2016, 15:55) *
Хочу поинтересоваться, для чего нужна предпоследняя строка в Вашей асмовой вставке, если Вы и так в GetRegistersFromStack читаете PC?
А фиг знает rolleyes.gif Когда то скопипастил откуда то, когда искал ошибку с HardFault, потом, помню, что то переделал. Потом ошибку нашел и забыл про этот код.
demiurg_spb
Цитата(prottoss @ Feb 8 2016, 13:05) *
А фиг знает rolleyes.gif
Понятно. Тогда можете её удалить.
Во вложении мой стартап для GCC (он конечно тоже изначально взят был откуда-то и творчески переработан)))
KRS
Цитата(prottoss @ Feb 1 2016, 18:43) *
В опциях компилятора, во вкладке препроцессора задаю тип платы, например OPEN407Z.

А в опциях для ассемблера задаете?
У IAR настройки препроцессора для ассемблера и с компилятора раздельные...
И препроцессор для asm вроде нормально работает... по крайней мере я с проблемами не сталкивался и #if со сложными условиями и #ifdef без проблем работали....
prottoss
Цитата(KRS @ Feb 9 2016, 12:41) *
А в опциях для ассемблера задаете?
У IAR настройки препроцессора для ассемблера и с компилятора раздельные...
И препроцессор для asm вроде нормально работает... по крайней мере я с проблемами не сталкивался и #if со сложными условиями и #ifdef без проблем работали....
Xe...Так и есть. Нужно было для препроцессора ассемблера тоже задавать тип платы... Вот я недогада... sm.gif
Но, тем не менее, все сложилось в лучшую сторону - я вообще избавился от ассемблерного стартапа, кучи предупреждений про неиспользуемые прерывания и кучи фалов. Так что обратно откатывать не буду, хоть и проблема выяснилась.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.