Jump to content

    

Neo_Matrix

Участник
  • Content Count

    136
  • Joined

  • Last visited

Everything posted by Neo_Matrix


  1. А что делать с ее инверсией? Логическая единица у rs232 меньше -3V. ПС: Процессор STM32F407 не имеет программной инверсии сигналов.
  2. Уже думал над таким вариантом, но он немного удорожит устройство, так как нужен корпус, плата, стоимость монтажа мелких партий. Если все разместить на общей плате, можно попробовать снизить стоимость. Кроме того мы не избавляемся от проблемы многих кабелей, под разные устройства. ПС: Забудьте про стороны :)
  3. Устройство должно работать с устройствами третьих лиц. К сожалению, я не виноват, что такие именитые производители, как Филлипс выводят наружу сигнал с логическими уровнями UART 5Вольт, при этом из защит там стоит делитель на резисторах и триггер-шмитта. А некоторые и вовсе пускают 3х вольтовую логику на внешний порт. В данной ситуации моя задача не исправлять косяки других производителей, а сделать устройство максимально гибко работающее со всеми типами интерфейсов. Блок питания разумеется общий для обеих устройств. Длина кабеля не превышает 50см. Как показала 2х годичная практика, не один порт не был сожжен. Но ранее на устройстве стоял разъем microfit на 8 контактов, и переключение интерфейсов решалось правильным обжимом кабеля, естественно это плодит кучу кабелей, документации на них.... но самое важное, на новом устройстве не хватает места под разъем более чем на 4контакта, использовать иные разъемы(не microfit) не хочется, так как они себя хорошо зарекомендовали, а с учетом криворукого обслуживающего персонала - разъемы меньшего калибра повыламывают к чертям. На моем устройстве ранее было сделано так: РС-232 порт подключался прямиком к разъему через резисторы и МАКС2323, порты ЮАРТ были выведены на соседние контакты из защиты стоял резистор за ним сапрессор(такого плана как на ЮСБ) + подтяжка, далее все было подключено к триггеру-шмитта, а после к процу.
  4. Возникла необходимость сделать "универсальный порт", который сможет объединить в себе три порта. В микроконтроллере имеется порт UART 3.3V, с него необходимо получить RS232, UART 3.3V, UART 5V, при этом выход идет на 4х контактный(Т.е. VCC, GND, RX, TX) разъем. Есть ли готовые решения под такую задачу? Или в MAX3232 можно отключать бустеры, но что делать с инвертированным сигналом?
  5. Не вижу никаких грабель, в логичном желании изменять переменную лишь в одном месте, а не в разбросанных по всему проекту местах. Закончилось - нечем, по прежнему использую конструкцию: const uint32_t magic_num __attribute__((section(".ARM.__at_0x08000188"))) = MAGIC_NUM; 1) Ключ --cpreproc не поддерживается в 6-й версии компилятора. 2) GBLA не подходит, так как создает переменную инициализированную нулем.
  6. Да, вполне неплохой вариант, затягивать переменную из ASM в С, а не на оборот. Спасибо Про EXTERN писал в первом сообщении, при таком подходе в нужную ячейку кладется не сама переменная, а адрес по которому переменная расположена. EXTERN напрямую на СИшный #define натравить не получается, при компиляции выдает ошибку.
  7. Собственно вопрос был не по 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 При этом таблица прерываний смещается сама, в зависимости от выбраного СКАТЕР файла, по этому хотелось более изящьного решения.
  8. В заголовочном СИ файле определено: #define MAGIC_NUM 0x568978 const magic_number = MAGIC_NUM; Эта переменная используется в Си коде проекта. Но еще эту переменную нужно прикрутить в конец таблицы векторов прерываний. Попробовал сделать так в стартап файле: EXTERN magic_number[DATA] ... ; Здесь находится таблица прерываний. DCD magic_number ; Добавил в конец таблицы. Так вот, после компиляции в конце таблицы прерываний размещается адрес переменной magic_number, а не само значение этой переменной. Можно ли сделать, что бы по этому адресу находилось именно значение, может значение СИшного #define можно использовать? Варинт с : DCD 0x568978 не рассматриваю, так как нужно помнить о замене 2х переменных. Среда KEIL для ARM.
  9. Подскажите софт, в котором можно составить документацию для производства партии кабелей. Т.е необходима принципиальная схема кабеля, схема обжима контактов, используемые типы контактов и т.д. Так же интересуют нормативные документы на кабеля\жгуты. Так же, если кто то имел опыт заказа изготовления кабелей, поделится примерами документации.
  10. Сработало на 100 %, попробовал на 2х разных файлах. Srecord действительно классная прога, я даже не задумывался о ее потенциале, впервые она мне помогла привести в порядок вывод файлов моторола-срекорд, а здесь оказывается она и такое может. Огромное спасибо, что подсказали! И писать не пришлось :) Все уже придумано до нас.
  11. Не погибнет, он живучий :) у меня SWD есть на такой случай. Спасибо, сейчас попробую
  12. x893 Написать прогу, это будет следующий этап, пока смотрю готовые варианты. scifi Тулзой SRecord я пользуюсь для формирования файлов, для дальнейшей отправки по воздуху, неужто в ней есть функция по добиванию конца прошивки мусором, до значения кратного 128?
  13. Необходима прошивка, размер файла которой будет кратен 128байтам, т.е необходимо после сборки проекта в Keil сформировать BIN кратный 128. Сейчас для генерации BIN использую встроенную тулзу fromelf. Попытался добавить параметры в командную строку: --bincombined --bincombined_base=0x8000000 --bincombined_padding=128,0xFF, но походу ее разработчики предусмотрели ограничение на параметр bincombined_padding в размере 4. На данный момент приходится сначала генерить BIN, а после увеличивать его размер в winhex, что со временем уже немного надоедает. Возможно кто то знает нормальное решение, желательно с командной строкой, так, как хочется напрямую в действия КЕЙЛа прописать.
  14. Использую Keil. В комплекте с FREERTOS есть демка, показывающая, как это делать. Сам не использую.
  15. Всем спасибо. Ошибка найдена. Функции strncmp при определенных стечениях обстоятельств передавался NULL вместо валидного указателя.
  16. Спасибо всем за ответы. Их действительно много и они вполне перекрывают вопрос. Думаю лучший способ настроить MPU(cortex m4) + в некоторых местах сделаю массивы на длину +1 элемент и поставлю туда брейкпоинт на запись и чтение. Вариант с перекрытием массивов очень сложен, так как кода много и проблемный массив неизвестен. Аналитически код был просмотрен уже неоднократно, был найден один ляп с приведением типов, но это не изменило ситуацию в корне. Так же интересует, в случае фриртоса и выделения памяти в хипе, если будет затерт конец массива выделенной памяти, будет ли вызван ассерт во время фрии, или в конце нет данных маллока для отслеживания окончания массива(используется heap4.c + его модификация под CCM память)? Вариант с испытательным сроком очень оригинален. Всем спасибо :)
  17. А нет ли подобного решения под 4тую версию?
  18. Подскажите, есть ли способ под FreeRTOS понять есть ли выходы за предел массива. Хуки на недостаток хипа и стека работают нормально и очень помогают, когда нужно зажать стек задачи до минимума. Но как отладить выход за пределы массивов? Такая необходимость появилась, так как иногда устройства перезагружаются сами по себе(в обработчиках исключений стоит функция сброса, так как устройства должны максимально быть доступны). Есть подозрение на выход за пределы. Так как проект достаточно крупный около 300кб кода с оптимизацией, пересмотреть, а главное заметить ошибку очень сложно. Кто, что может порекомендовать?
  19. Как я понял Вам нужна колбэк функция. Которая вызовется после окончания приема. Если проэкт генерился в КубеМХ. At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() HAL_I2C_Slave_Receive_IT должна вызываться сама, цикл не нужен.
  20. Собственно вопрос, насколько безопасно использовать вызов функции osThreadResume из обработчика прерывания, которая описана в файле cmsis_os.с. Данный файл генерируется Кубом при создании проэкта с РТОС. Проц серии stm32f4xx. Сама функция: osStatus osThreadResume (osThreadId thread_id) { #if (INCLUDE_vTaskSuspend == 1) if(inHandlerMode()) { if (xTaskResumeFromISR(thread_id) == pdTRUE) { portYIELD_FROM_ISR(pdTRUE); } } else { vTaskResume(thread_id); } return osOK; #else return osErrorResource; #endif } Как я заметил, функция выполняет проверку откуда она была вызвана. Но так ли это на самом деле?
  21. Да, возможно я не очень точно описал мою проблему. Проблема была в объявлении ХЕНДЛА в отдельном файле не main.c. Собственно уже решено, всем спасибо. Спорить не хочу, но это работает на Дискавери 4. Варнинги у меня не подавлены. С чего Вы вообще взяли, что подавлены варнинги? В любом случае x893 уже дал ответ на поставленный вопрос. Да и выше было сказано о примере кода, а не о конечном варианте.
  22. Не понял к чему это сказано, вопрос был несколько иным... Какое отличие между тем, что задача ожидает очередь или семафор от применения засыпания в конце задачи и дальнейшим пробуждением из прерывания. То что очередь может передать данные - не в счет.
  23. Все теперь понял. Это и был основной вопрос, спасибо! Относительно гневных комментариев: Сам вызов буду осуществлять через cmsis_os, Весь код приведен только как пример(кстати если его записать только в мейне, то все будет работать(возможно не долго)). Между прочим код компилится без варнингов и без ошибок, если все сгрузить в мейн.
  24. x893 Спасибо, но если бы все было в одном main.c все сработало бы.Я не могу понять как в данном случае объявить ХЭНДЛ в стороннем файле, если extern применить не ясно как(для меня). В моем случае получается multiply defined vDeleteSTR.
  25. Хорошо допустим есть main.c c с содержимым: #include "irq.h" void vDeleteSTR(void const * argument); int main(void) osThreadDef(DeleteSTR, vDeleteSTR, osPriorityIdle, 0, 1024); DeleteSTRHandle = osThreadCreate(osThread(DeleteSTR), NULL); osKernelStart(); while(1){} void vDeleteSTR(void const * argument) { //Здесь удаляем строку vTaskSuspend(NULL); // Здесь засыпаем, пока прерывание не разбудит... } Есть файл irq.c c содержимым: void USART3_IRQHandler(void) { xTaskResumeFromISR(vDeleteSTR);// Пробовал писать так } Как правильно разбудить задачу vDeleteSTR с прерывания, обработчик которого вынесен в отдельный .с файл ? Если можно примером кода.