реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> директивы препроцессора для *.s(asm) файлов в Keil
grisha_scorpion
сообщение Dec 22 2015, 12:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



Немного конечно не в тему. Просто не не нашел на форуме про среду разработки Keil.
Подскажите пожалуйста как использовать директивы препроцессора в asm файлах в Keil?
Интересуют такие директивы как #ifdef, #endif и т.д.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 22 2015, 14:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Препроцессор - это для Си. В ассемблере есть аналогичные возможности.
Загляните в мануал.
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Dec 22 2015, 17:22
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



Цитата(scifi @ Dec 22 2015, 17:01) *
Препроцессор - это для Си. В ассемблере есть аналогичные возможности.
Загляните в мануал.

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

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


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


Вопрос: будет ли виден дефайн ABS в файле asd.s? Нужно наверно как то подключить файл qwe.h. Как это сделать?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2015, 17:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Как и в 'C':
#include "qwe.h"
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Dec 22 2015, 17:37
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

Проверил. Так не катит. Выдает ошибку
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 22 2015, 17:41
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Надо еще отдельно через препроцессор протащить. Подробности тут.
На фоне конкурентов довольно "костыльно", конечно.
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Dec 23 2015, 08:35
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



Цитата(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 с ассемблерным форматом.
Предложите еще варианты как все таки сделать так, чтобы в ассемблерном файле можно было контролировать объявление дефайна.

Сообщение отредактировал grisha_scorpion - Dec 23 2015, 09:04
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 23 2015, 10:00
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

Собственно говоря использовать IARовский ассемблер, тем более что и тема про IAR
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Dec 23 2015, 11:29
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

Я понимаю что тема про IAR, но на форуме я не нашел темы связанной с Keil, что для меня странно.
IARовский компилятор без проблем схавает в ассемберном фалйе такие конструкции как #ifdef, #else, #endif... И я это делаю успешно в IARе. Но у меня сейчас проект использует keilовский компилятор. Переводить все в IAR не хочу по разным причинам.
Go to the top of the page
 
+Quote Post
grisha_scorpion
сообщение Dec 23 2015, 14:32
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 24-08-10
Пользователь №: 59 074



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

Попробовал как в ссылке. Не помогает.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 24 2015, 06:32
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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


А чего тут может не помогать? Вам надо отдельно запустить внешний препроцессор, а его выход уже скормить компилятору.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 1 2016, 15:43
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Доброго времени суток. Не стал открывать новую тему, так как вопрос про препроцессор ассемблера...Но для 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" тело стартапа нифига не компилится!
В чем я ошибаюсь?

Спасибо!


--------------------
Go to the top of the page
 
+Quote Post
Garmin
сообщение Feb 3 2016, 14:02
Сообщение #13





Группа: Участник
Сообщений: 5
Регистрация: 23-11-14
Пользователь №: 83 800



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

Мне тоже пришлось повозиться с ассемблерным стартапом в IAR. Но я вышел из положения другим путём: избавился от ассемблерного стартапа совсем. Добавил описание таблицы прерываний в *_it.c файл. Пример для STM32F446 по ссылке:
http://forum.easyelectronics.ru/viewtopic....=428768#p428768
После такого преобразрвания нетрудно написать любые сишные команды препроцессора.

Сообщение отредактировал Garmin - Feb 3 2016, 14:03
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 3 2016, 14:09
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Всё это можно через Makefile разрулить...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 3 2016, 15:37
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Спасибо за ответыю
Все что сказано выше - понятно. Но, я думал, раз в документации сказано, что препроцессор С поддерживается - можно все сделать так, как сделал я.


--------------------
Go to the top of the page
 
+Quote Post
drozel
сообщение Feb 5 2016, 10:45
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650



Цитата(Garmin @ Feb 3 2016, 20:02) *
Но я вышел из положения другим путём: избавился от ассемблерного стартапа совсем.

Вот и именно. Вообще не понимаю, откуда растут ноги у ассемблерного стартапа: вроде даже сам ARM поставляет сишный стартап для ядра.
Даже если нет, написать структуру на сях - делов на 20 минут. Заодно обработчики дефолтные можно накидать, используя прелести __weak
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 5 2016, 10:47
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(drozel @ Feb 5 2016, 13:45) *
Вот и именно. Вообще не понимаю, откуда растут ноги у ассемблерного стартапа: вроде даже сам ARM поставляет сишный стартап для ядра.

Люто плюсую. В открытую была заявлена одна из целей создания Cortex-M: чтобы можно было запрограммировать всё без ассемблера.
А про ноги можно предположить: ARM7TDMI требовал ассемблера, ну а дальше по инерции продолжилось...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 6 2016, 13:31
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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

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

Интересно - можно ли такое сварганить для других компиляторов? Попробовал сегодня в Keil - но я его не использую и по этому с наскоку не получилось.

Прикрепленные файлы
Прикрепленный файл  startup.zip ( 6.48 килобайт ) Кол-во скачиваний: 19
 


--------------------
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 8 2016, 09:55
Сообщение #19


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(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 меня полностью устраивает...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 8 2016, 10:05
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(demiurg_spb @ Feb 8 2016, 15:55) *
Хочу поинтересоваться, для чего нужна предпоследняя строка в Вашей асмовой вставке, если Вы и так в GetRegistersFromStack читаете PC?
А фиг знает rolleyes.gif Когда то скопипастил откуда то, когда искал ошибку с HardFault, потом, помню, что то переделал. Потом ошибку нашел и забыл про этот код.


--------------------
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 8 2016, 10:13
Сообщение #21


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(prottoss @ Feb 8 2016, 13:05) *
А фиг знает rolleyes.gif
Понятно. Тогда можете её удалить.
Во вложении мой стартап для GCC (он конечно тоже изначально взят был откуда-то и творчески переработан)))
Прикрепленные файлы
Прикрепленный файл  STM32F10X_startup.c.zip ( 2.87 килобайт ) Кол-во скачиваний: 15
 


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 9 2016, 06:41
Сообщение #22


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(prottoss @ Feb 1 2016, 18:43) *
В опциях компилятора, во вкладке препроцессора задаю тип платы, например OPEN407Z.

А в опциях для ассемблера задаете?
У IAR настройки препроцессора для ассемблера и с компилятора раздельные...
И препроцессор для asm вроде нормально работает... по крайней мере я с проблемами не сталкивался и #if со сложными условиями и #ifdef без проблем работали....
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 9 2016, 07:35
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01627 секунд с 7
ELECTRONIX ©2004-2016