Перейти к содержанию
    

Neo_Matrix

Участник
  • Постов

    145
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Neo_Matrix


  1. xvr, andrew_b

    Так работает, но компилятор выдает ворнинги (113): warning: declaration of 'struct config_t' will not be visible outside of this function [-Wvisibility]

    18 минут назад, jcxz сказал:

    Никаких C11 и иже с ними не нужно - всё что нужно было ещё в простом си: читайте мануал на тему "Неполное объявление типа". Пример:

    Спасибо, это то что нужно! Главное, про не полное объявление уже читал, но так и не использовал ранее :)

  2. 21 минуту назад, Forger сказал:

    Сделать объявление config_t видимым всем, кто его использует.

    Для этого достаточно разместить этот typedef в соотв. h-файле и инклудить этот файл в те C-файлы, где этот тип используется.

    Так не прокатит. typedef result_e(*func_t)(config_t *arg); будет вне области видимости, или я не допонял?

  3. Допустим есть typedef указатель на функцию, в качестве аргумента которой должна передаваться структура:

    typedef result_e(*func_t)(config_t *arg);

    И есть структура, которая содержит разные аргументы и указатели на функции func_t

    typedef struct {
    	uint8_t				error;
    	uint8_t				some_param_1;
    	uint8_t				some_param_2;
    	func_t				f_now;
    	func_t				f_next;
    } config_t;

    Разумеется вне зависимости в каком порядке их не разместить будет ошибка компиляции, так как компилятор не будет видеть или новый тип данных - функцию или структуру.

    В С11 сделать такой финт просто - объявить анонимную структуру выше указателя на функцию, но как это провернуть в С99?

    Приходит в голову только описать указатель на функцию с аргументом void и далее приводить типы, может есть другой подход?

    Цитата
    
    typedef result_e(*func_t)(void *arg);
    //Или так без приведения типов....
    typedef result_e(*func_t)();

     

     

  4. 4 часа назад, Aner сказал:

    да стада бесплатных либ в инете найти можно повсюду

    Как не странно, но приведенный выше скрин из стандартного набора "Птицы" : con-molex компонент SIM-CARD_496191611.

  5. Спасибо за подсказку.

    С экселем все норм.

    Просто не могу понять отличия полей Mid X Y и Ref X Y. Первое это центр компонента. Второе это референсный центр компонента согласно документации(чего в даташитах я не наблюдал).  По идее они ведь должны совпадать?

    2 часа назад, Aner сказал:

    расстановку компонентов с крестиком ( центром) итак видно в орле, чё не так?

    В орле часть компонентов с крестом в левом нижнем углу, а не по центру.Допустим:

    image.png.bb7ea61206458787075909469aa4cb2e.png

  6. Спасибо.

    3 часа назад, Aner сказал:

    Сгенегённый в Eagle UPL_кой P&P файл выводишь в формате CSV

    А как сама UPL называется не подскажите, не могу найти?

    Кроме того не ясно, как потом эту таблицу зачекать. Может есть софт по типу CAM350, где можно просмотреть расстановку компонентов после скрипта?

  7. Подскажите каким образом можно с Орла экспортировать данные о размещении компонентов? Формат файла должен соответствовать формату EasyEDA.

    Пример: https://docs.easyeda.com/en/Export/Export-Coordinate/index.html

    Как слить центры компонентов мне в принципе ясно, но что делать с остальным?

    При том производитель принимает только такой формат и никак иначе.

  8. 3 часа назад, Plain сказал:

    Вообще, MAX3232 совместима со всеми тремя случаями, если ограничить её выходной ток резистором

    А что делать с ее инверсией? Логическая единица у rs232 меньше -3V.

    ПС: Процессор STM32F407 не имеет программной инверсии сигналов.

  9. Уже думал над таким вариантом, но он немного удорожит устройство, так как нужен корпус, плата, стоимость монтажа мелких партий. Если все разместить на общей плате, можно попробовать снизить стоимость. Кроме того мы не избавляемся от проблемы многих кабелей, под разные устройства.

    ПС: Забудьте про стороны :)

     

  10. Устройство должно работать с устройствами третьих лиц. К сожалению, я не виноват, что такие именитые производители, как Филлипс выводят наружу сигнал с логическими уровнями UART 5Вольт, при этом из защит там стоит делитель на резисторах и триггер-шмитта. А некоторые и вовсе пускают 3х вольтовую логику на внешний порт. В данной ситуации моя задача не исправлять косяки других производителей, а сделать устройство максимально гибко работающее со всеми типами интерфейсов. Блок питания разумеется общий для обеих устройств. Длина кабеля не превышает 50см. Как показала 2х годичная практика, не один порт не был сожжен. Но ранее на устройстве стоял разъем microfit на 8 контактов, и переключение интерфейсов решалось правильным обжимом кабеля, естественно это плодит кучу кабелей, документации на них.... но самое важное, на новом устройстве не хватает места под разъем более чем на 4контакта, использовать иные разъемы(не microfit) не хочется, так как они себя хорошо зарекомендовали, а с учетом криворукого обслуживающего персонала - разъемы меньшего калибра повыламывают к чертям.

    На моем устройстве ранее было сделано так: РС-232 порт подключался прямиком к разъему через резисторы и МАКС2323, порты ЮАРТ были выведены на соседние контакты из защиты стоял резистор за ним сапрессор(такого плана как на ЮСБ) + подтяжка, далее все было подключено к триггеру-шмитта, а после к процу.

  11. Возникла необходимость сделать "универсальный порт", который сможет объединить в себе три порта. В микроконтроллере имеется порт UART 3.3V, с него необходимо получить RS232, UART 3.3V, UART 5V, при этом выход идет на 4х контактный(Т.е. VCC, GND, RX, TX) разъем. Есть ли готовые решения под такую задачу? Или в MAX3232 можно отключать бустеры, но что делать с инвертированным сигналом?

  12. 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 не подходит, так как создает переменную инициализированную нулем.

  13. 42 minutes ago, scifi said:

    Предлагаю многоходовочку.

    ...

    Да, вполне неплохой вариант, затягивать переменную из ASM в С, а не на оборот. Спасибо

    35 minutes ago, ViKo said:

    Там, если не ошибаюсь, всё решается волшебным словом EXTERN. Но я не смог найти, где обсуждалось.

    Про EXTERN писал в первом сообщении, при таком подходе в нужную ячейку кладется не сама переменная, а адрес по которому переменная расположена.

    EXTERN напрямую на СИшный #define натравить не получается, при компиляции выдает ошибку.

  14. Собственно вопрос был не по 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

    При этом таблица прерываний смещается сама, в зависимости от выбраного СКАТЕР файла, по этому хотелось более изящьного решения.

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

    #define MAGIC_NUM 0x568978
    
    const magic_number = MAGIC_NUM;

    Эта переменная используется в Си коде проекта. Но еще эту переменную нужно прикрутить в конец таблицы векторов прерываний.

    Попробовал сделать так в стартап файле:

    EXTERN    magic_number[DATA]
    
    ... ; Здесь находится таблица прерываний.
    
    DCD        magic_number ; Добавил в конец таблицы.

     

    Так вот, после компиляции в конце таблицы прерываний размещается адрес переменной magic_number, а не само значение этой переменной.

    Можно ли сделать, что бы по этому адресу находилось именно значение, может значение СИшного #define можно использовать?

    Варинт с :

    DCD 0x568978

    не рассматриваю, так как нужно помнить о замене 2х переменных.

    Среда KEIL для ARM.

  16. Подскажите софт, в котором можно составить документацию для производства партии кабелей. Т.е необходима принципиальная схема кабеля, схема обжима контактов, используемые типы контактов и т.д. Так же интересуют нормативные документы на кабеля\жгуты. Так же, если кто то имел опыт заказа изготовления кабелей, поделится примерами документации.

  17. Там много чего есть. Если не ошибаюсь, так:

     

    Сам не пробовал, так что если ваш котик погибнет, я не виноват.

    Сработало на 100 %, попробовал на 2х разных файлах. Srecord действительно классная прога, я даже не задумывался о ее потенциале, впервые она мне помогла привести в порядок вывод файлов моторола-срекорд, а здесь оказывается она и такое может. Огромное спасибо, что подсказали!

     

    там есть функция для создания функции :biggrin: , а уж дописать пару байт.. СС2430 заставил изучить эту утиль подробно..

    И писать не пришлось :) Все уже придумано до нас.

  18. x893

    Написать прогу, это будет следующий этап, пока смотрю готовые варианты.

    scifi

    Тулзой SRecord я пользуюсь для формирования файлов, для дальнейшей отправки по воздуху, неужто в ней есть функция по добиванию конца прошивки мусором, до значения кратного 128?

  19. Необходима прошивка, размер файла которой будет кратен 128байтам, т.е необходимо после сборки проекта в Keil сформировать BIN кратный 128. Сейчас для генерации BIN использую встроенную тулзу fromelf. Попытался добавить параметры в командную строку: --bincombined --bincombined_base=0x8000000 --bincombined_padding=128,0xFF, но походу ее разработчики предусмотрели ограничение на параметр bincombined_padding в размере 4. На данный момент приходится сначала генерить BIN, а после увеличивать его размер в winhex, что со временем уже немного надоедает. Возможно кто то знает нормальное решение, желательно с командной строкой, так, как хочется напрямую в действия КЕЙЛа прописать.

     

  20. Спасибо всем за ответы. Их действительно много и они вполне перекрывают вопрос. Думаю лучший способ настроить MPU(cortex m4) + в некоторых местах сделаю массивы на длину +1 элемент и поставлю туда брейкпоинт на запись и чтение. Вариант с перекрытием массивов очень сложен, так как кода много и проблемный массив неизвестен. Аналитически код был просмотрен уже неоднократно, был найден один ляп с приведением типов, но это не изменило ситуацию в корне. Так же интересует, в случае фриртоса и выделения памяти в хипе, если будет затерт конец массива выделенной памяти, будет ли вызван ассерт во время фрии, или в конце нет данных маллока для отслеживания окончания массива(используется heap4.c + его модификация под CCM память)? Вариант с испытательным сроком очень оригинален. Всем спасибо :)

×
×
  • Создать...