ViKo 1 13 марта, 2018 Опубликовано 13 марта, 2018 · Жалоба Ну - у меня тоже обработчик fault-ов на асм написан. Только он в несколько десятков раз больше. Есть пример такого обработчика в книгах Джозефа Ю. У меня рабочий макет всегда на столе, подключиться отладчиком в нутро не проблема. Поэтому обошелся тем, что показал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 13 марта, 2018 Опубликовано 13 марта, 2018 · Жалоба Есть пример такого обработчика в книгах Джозефа Ю. У меня рабочий макет всегда на столе, подключиться отладчиком в нутро не проблема. Поэтому обошелся тем, что показал. Я о том, что подозреваю что ТСу вообще "асм в си" не нужен. А хочет он уменьшить время запрета прерываний в критических секциях. А делается это после прочтения мануала по командам LDREX/STREX. Как всегда приходится домысливать неозвученное за автора.... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба Подниму тему. Keil, compiler v6.12 (armclang). Есть модуль, состоящий из 3 файлов: .s, .c и .h. В .c-файле глобально объявлена структура struct _dev { u32 a; volatile u32 b; volatile u32 c[MAX_C_QNT]; u32 *d[MAX_D_QNT]; }Dev; В .h-файле, помимо объявления прототипов функций, макрос-функций и т.д., есть макроопределения MAX_C_QNT и MAX_D_QNT. В .s-файле реализована функция, которая работает со структурой выше. Все бы ничего, но... как обратиться к элементу 'd'? Параметр 'c' имеет вариативный размер. Существуют ли адекватные способы в Keil рассчитать смещение от начала структуры до нужного элемента в .s-файле? В .s-файл можно включить .h-файл с макроопределениями MAX_C_QNT/MAX_D_QNT, но в этом .h ничего, кроме как этих определений, тогда быть не должно. А плодить заголовочные файлы как-то не хочется. P.S. Пока что на ум приходит использовать синтаксис встроенного ассемблера в .c-файле. Но, ИМХО, не комильфо. Я считаю, что asm-коду место в .s-файлах... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 28 минут назад, Arlleex сказал: Параметр 'c' имеет вариативный размер. Почему? Насколько я понял, MAX_C_QNT - это константа? А, понял. Проблема во включении *.h-файла в *.S? Вот это не поможет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 14 минут назад, AHTOXA сказал: Почему? Насколько я понял, MAX_C_QNT - это константа? #define обычный. #define MAX_C_QNT 5, допустим. Смысл в том, что в Си-коде любые смещения будут высчитываться автоматически. А ведь ассемблерному надо знать эти же MAX_C_QNT и т.д. Грубо говоря, из ассемблерной функции надо обратиться к 0-му элементу параметра 'd' структуры Dev. Собственно, пишу PRESERVE8 THUMB AREA |.text|, CODE, READONLY func PROC EXPORT func IMPORT Dev push {r1-r4} ldr r1, =Dev ; берем адрес Dev ldr r2, [r1] ; получаем значение 'a' ldr r3, [r1, ???] ; западло: как достучаться до 'd', не зная, сколько элементов в 'c'? ... То есть в .s-файле должно быть видно определение MAX_C_QNT. 14 минут назад, AHTOXA сказал: А, понял. Проблема во включении *.h-файла в *.S? Вот это не поможет? О. Сейчас почитаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба добавить const sizе_t max_c_cnt = MAX_C_QNT; чтобы из ассемблера его видно было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба .S вместо .s не помогло. Во вкладке 'Asm' в Keil-е в Misc Controls вписал -E -x assembler-with-cpp eds.s. Теперь мне компилятор ругается так Спойлер Цитата Rebuild started: Project: CANTrainBus *** Using Compiler 'V6.12', folder: 'D:\Program Files\Keil\ARM\ARMCLANG\Bin' Rebuild target 'sources' assembling eds.s... eds.s: Error: A1067E: Output file specified as 'eds.s', but it has already been specified as '.\objects\eds_1.o' eds.s: Error: A1067E: Output file specified as 'user\eds.s', but it has already been specified as '.\objects\eds_1.o' compiling hw.c... compiling main.c... compiling eds.c... compiling stm32f10x_crc.c... compiling stm32f10x_adc.c... compiling stm32f10x_gpio.c... compiling stm32f10x_can.c... assembling startup.s... startup.s: Error: A1067E: Output file specified as 'eds.s', but it has already been specified as '.\objects\startup.o' startup.s: Error: A1067E: Output file specified as 'system\startup.s', but it has already been specified as '.\objects\startup.o' compiling stm32f10x_iwdg.c... compiling stm32f10x_i2c.c... compiling stm32f10x_spi.c... compiling stm32f10x_rcc.c... compiling stm32f10x_usart.c... compiling stm32f10x_tim.c... ".\Objects\CANTrainBus.axf" - 4 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:01 26 минут назад, _pv сказал: добавить const sizе_t max_c_cnt = MAX_C_QNT; чтобы из ассемблера его видно было. Это я понимаю. Но я не хотел плодить, по сути, одинаковые константы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба ну препроцессор можно отдельно на что угодно натравить gcc -E < input > output и тогда добавить в ассемблерный файл #define MAX_C_CNT или #include "header.h" если там ничего кроме примитивных дефайнов констант нету. он и в ассемблерном файле точно так же заменит MAX_C_CNT на 5. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 27 минут назад, _pv сказал: если там ничего кроме примитивных дефайнов констант нету. Именно. У меня .h-ник не только препроцессорные директивы содержит =( Ладно. Сейчас сделал ход конем - поменял порядок элементов в структуре, чтобы гарантированно знать положение 'd'. Решение такое себе, конечно (в плане дальнейшего применения в других задачах). Но конкретно тут оно смотрится вполне адекватно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 4 часа назад, Arlleex сказал: Во вкладке 'Asm' в Keil-е в Misc Controls вписал -E -x assembler-with-cpp eds.s. Теперь мне компилятор ругается так -E, на мой взгляд, лишнее. 2 часа назад, Arlleex сказал: Именно. У меня .h-ник не только препроцессорные директивы содержит =( Если это свой *.h, то его можно разделить на два. Или вставить проверку (это для GCC, не знаю, так ли для шланга) #ifndef __ASSEMBLER__ // здесь то, что не должен видеть ассемблер #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 19 минут назад, AHTOXA сказал: -E, на мой взгляд, лишнее. Без него тоже было не густо... Щас вообще сижу переписываю стартап-файл для своего МК. Идиотизм какой-то - синтаксис полностью другой, все еще сопровождается кучей непонятных сообщений от компайлера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 3 минуты назад, Arlleex сказал: Без него тоже было не густо... А, и "eds.s" тоже лишнее. Это же ключи, а имя файла подставит сам кейл. 4 минуты назад, Arlleex сказал: На строчку .if Heap_Size != 0 ругается Если научитесь передавать опцию -x assembler-with-cpp, то можно будет писать привычно: #if Heap_Size != 0 5 минут назад, Arlleex сказал: Охренительный инструмент, блин... Пора уходить на IAR, видимо Это же gcc-шный синтаксис, его есть смысл изучить. Тем более, что и IAR уже тоже движется в этом направлении. По крайней мере, inline assembler для него уже полностью повторяет GCC-шный (пример). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 2 минуты назад, AHTOXA сказал: А, и "eds.s" тоже лишнее. Это же ключи, а имя файла подставит сам кейл. Ага. Попробовал. В принципе для этих целей в Keil-е есть галочка на вкладке 'Asm'. Она этот ключик сама добавляет в список ключей командной строки. Я, если честно, не совсем понимаю структуру документации, какие мне документы нужны для полноты картины. Вот, нашел вот такой документ. С ним более-менее понятно, какие директивы на какие поменялись при миграции компилятора. Но откуда выцыганить внятное описание самих директив? Их синтаксис, возможные вариации и т.д? Типичный пример: читая документ выше, вижу, что функции в ассемблере оформляются как .type Reset_Handler, "function". Открываю в дебрях установленного Keil-а шаблонный стартап для моего ядра и вижу .type Reset_Handler, %function. Вот сижу и думаю: я об этой разнице в % и "" сам должен догадаться (есть она или ее нету) или оно где-то описано? =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 4 минуты назад, Arlleex сказал: Но откуда выцыганить внятное описание самих директив? Их синтаксис, возможные вариации и т.д? Здесь я, к сожалению, не помощник, потому что не использую кейл :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 5 мая, 2020 Опубликовано 5 мая, 2020 · Жалоба 2 минуты назад, AHTOXA сказал: Здесь я, к сожалению, не помощник, потому что не использую кейл :-) А, коли не секрет, чем пользуетесь? Просто интересно =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться