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

juvf

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    2

Весь контент juvf


  1. искать пробовали? первая ссылка
  2. Вы почитайте .... даже на этом форуме... не раз кто-нибудь забрасывал задачу "нужно прочитать микроконтроллер с защитой от чтения"... кто своё хотел прочитать, кто пиратскую копию хотел сделать... в 2-х словах: защиту на МК делали не для того, чтобы её можно было сломать. Если бы её можно было бы сломать, её бы не ставили и многие бы не вкладывали годы разработок и кучу денег, чтобы потом какойнить Чанг Ли мог в гараже делать клоны.
  3. у вас в задаче про защиту от чтения ни чего не сказано. Защиту от чтения не сломать. .... теоретически сломать... но это ещё на 2-3 порядка дороже, поэтому раз 10-100 дешевле по новой написать, чем сломать защиту. ИМХО.
  4. а вы чем собираетесь прошивать новые устройства? каким нибудь stvp.exe + st-link. Так прочитайте прошивку сами. Будет вам хекс. Если вам требуется восстановить исходники - то это другая задача.... это реинженеринг. Это очень тяжело и дорого. Дешевле по новой написать.
  5. да. задачуО можно заблокировать на ожидание в группе эвентов на два бита. бит0 - прерывание инт. бит1 - есть в буфере пакет для отправки. ЗадачаО по пробуждении проверит, какой бит и соответственно сделает нужную работу. на сколько я помню, udp вам гарантирует целостность пакета. Если пакет, при передаче побьётся, вы его не получите (он будет потерян). Целостность пакета может нарушить только отправитель, если он отправит кривые данные.
  6. нет такого прерывания, по крайней мере в stm32f4* и в stm32f1*. Только по фронтам.
  7. не очень понятно. .... чтоб не путаться расставим точки над i. есть задача(~и), которая(~ые) ведут обмен по udp(tcp) - пусть будут задачаА, задачаВ. Есть задача, которая обрабатывает прерывания - задачаО (обработчик). В обработчике прерывания ISR только сигналить, что есть прерывание и пробуждать задачуО. в прерывании ни в коем случае не лезть в старусные регистры... ни какие там SPI не опрашивать. Всё это делать в задачеО. Если у вас два или три W5300 (у меня было 2 шт), то с каждого прерывания посылать свой бит-эвент. Прерывание нужно, только чтобы пробудить МК/задачу. В обработчике прерывания: Послал эвент, сбросил (если нужно) флаг прерывания. ВСЁ!!! Нахождение в прерывании - минимальное время. В задачеО блокироваться до получения этих эвентов, как я говорил ранее. В задачеО, после пробуждения, вычитывать статусные регистры и по ним определять с какого сокета прерывание/пакет/событие. Если пришел пакет с socked0, то вычитывать пакет из сокета0 и далее.... как вам удобно.... например динамически выделить область памяти, положить туда пакет, адрес (указатель) начала пакета отправить в очередь queueReciveSocked0. если пакет с сокета4, то выделить область памяти, положить туда пакет, адрес (указатель) начала пакета отправить в очередь queueReciveSocked4. Или с сокета0 и с сокета4 полученные данные отправлять в одну очередь queueReciveForTaskA. Или иметь статический буффер для каждого сокета/задачиА/задачиВ. Вычитываем сокет0 и посылаем эвент в группу что полученны данные от сокета0. ЗадачаА проверяет очередь queueReciveSocked0/queueReciveForTaskA или смотрит биты в групповом эвенте. при получении в очереди queueReciveSocked0/queueReciveForTaskA сообщения или бита в эвенте, задачаА обрабатывает пакет. Передача из задачиО в задачуА - это алгоритмы на вскидку.... что первое в голову пришло... Обратите ещё внимание на xStreamBuffer и на xMessageBuffer. Возможно они лучше подойдут для вашей задачи. Можно объявить сделать структуру/класс, что типа struct { int socked; //номер сокета int len;//размер пакета uint8_t *data; IpAdrressSource ip; AnyType samething; }; в задачеО вычитывать пакет, создавать эту структуру и отправлять мессадж. А в задачеА и задачеВ обрабатывать. Отправку из МК наружу через W5300 можно нужно тоже сделать через задачуО. Ибо нефиг каждой задаче лезть в SPI... да и вообще... вы можете поменять W5300 на W5100, или поменять SPI на параллельную шину, или вообще уйти на процессор со встроенным ethernet. Вам достаточно переписать задачуО, а задачи А и В останутся неизменными. ps повторю своё сообщение, с новой терминологией всю обработку и разбор статусных регистров вести в задаче-обработчике-событий-W5100 задачеО. в задачеО блокироваться до получения эвента со сбросом при получении. в задачеО вычитывать статусные регистры w5300 и обрабатывать все пакеты (т.е. вычитывать пакеты и отправлять задачам А и В). обработку вычетку пакетов в задачеО вести до тех пор, пока есть активный уровень INT. Потом блокироваться на ожидании эвента из прерывания. pps эвент - имеется в виду xEventGroup
  8. таймеры не нужны и не нужно периодически проверять размеры данных в сокетах. из прерывания посылать эвент, как факт того, что произошло прерывание. всю обработку и разбор статусных регистров вести в задаче-обработчике-событий-W5100. в задаче блокироваться до получения эвента со сбросом при получении. в задаче вычитывать статусные регистры w5300 и обрабатывать все пакеты. обработку вести до тех пор, пока есть INT. как только инт пропал, блокироваться на ожидании нового эвента из прерывания.
  9. ShareParam .h bool getDataFromAdc(void *data) {.....}; Protection.h void protection(void *data) {....}; mainTask.c #include "ShareParam.h" #include "Protection.h" void mainTask(void *context) { uint8_t data[128]; for(;;) { if(getDataFromAdc(data)); protection(data); delayMs(10); } } Это на вскидку.... можно void getDataFromAdc(void *data, bool *isNeedProtection = 0); Внутри getDataFromAdc, если isNeedProtection != 0, то вернуть бул.... можно как antis Даже если не нужна ртос и не нужно 2 задачи... то всё равно нужно отделять мух от котлет модули др от др.
  10. или вы задачу не правильно формулируете.... или .... Если не нужно выполнять два действия "параллельно", то зачем 2 задачи? У вас действия выполняются последовательно. Для того, что бы модули были независимы, не нужно разносить их в отдельные задачи, нужно их сделать независимыми. Например... первый модуль в ShareParam .h void getDataFromAdc(void *data) {.....}; второй модуль Protection.h void protection(void *data) {....}; Вот вам два абсолютно независимых модуля. Нет ни какого смешения логики. Оба модуля абсолютно абстрагированы др от др. Теперь задача mainTask.c #include "ShareParam.h" #include "Protection.h" void mainTask(void *context) { uint8_t data[128]; for(;;) { getDataFromAdc(data); pronection(data); delayMs(10); } } оба модуля работают совершенно независимо и последовательно. Если нужно собрать без защиты, просто закомментировать функцию protection() и #include "Protection.h" в задаче. Конечно, для практики с РТОС можно getDataFromAdc() вызывать в одной задаче, protection() вызывать в другой.... можно выделять память uint8_t data[128] в третей..... Можно и холоворд разбить на количество задач, равным кол-ву букв. Оверинженеринг.
  11. а если закомментировать вызов этой функции, то модуль ShareParam не сможет работать без модуля защиты? Что-то с каркасом не так. на сколько я понял, у вас два последовательный действия: 1) вычитка с ацп 2) проверка данных (модуль защиты). зачем их параллелить в 2 задачи?
  12. мингв съел. спасибо. (void)a не дает ни каких наставлений компилятору что аргумент не используется. это "формальное использование" аргумента. Он не используется, но чтобы компилятор не ругался, ему показывают, якобы он используется. костыль. имхо. в с++ это решается проще void f(int) { } Просто в определении не указывается имя.
  13. объявлена функция void f(int a); определена так void f(int a) { } компилятор СИ дает ворнинг - неиспользуемая переменная. переопределил так void f(int) { } компилятор дает ошибку parameter name omitted. костыль исправляет ситуацию void f(int a) { (void)a; } как ещё можно решить проблему?
  14. в си (а фриртос на си) нет булей. у тс нормальная строка. 2тс, попробуй так while(! (huart5.Instance->SR & UART_FLAG_TС) );
  15. Разобрался, спасибо. В гербере в тексте 79,5 мм.
  16. поставил FlatCAM, открыл гербер - ширина 79,5мм. открываю этот же гербер в KiCad - ширина 80 мм. Шаг сетки 0.1 мм. Производитель на своём оборудовании открыл в неизвестном мне просмотровщике, прислал скрины - ширина 80 мм. да, начало выставлено нормально. какие-то галочки в АД при экспорте нужно? Указываю мм 4:3, rs274x, в адвансетах так ... Какие-то разные форматы герберов бывают?
  17. AD 15.1 Простая прямоугольная плата. Делаю контур платы через Design->Board Shape->Create Primitives from board shape, размещаю в пустом механическом слое G20. В окошке Reports->Board Information... штрина платы 79.5 мм. Поползал курсором по механическому слою G20 - ширина контура получилась 79,5 мм. Отправил герберы на производство, они вернули, говорят в описании ширина платы 79,5, а сам гербер ширина 80 мм. Я по новой всё в АД перепроверил, сгенерировал свежие герберы, открыл их в KiCad другом просмотровщике герберров, измерил ширину, получил 80 мм. Почему АД генерирует неправильные герберы? ps AD16.0 также генерирует с ошибкой в 0,5 мм pcb_gerber.GM20
  18. STM32CubeIDE

    В путях до инсталлятора не должно быть кириллицы
  19. STM32CubeIDE

    зачем нужны коты нужен openocd? У вас st-link, stm32cudeide в которой есть по дефолту ST-LINK GDB SERVER. ps перед запуском отладчика удалите все брейкпоинты
  20. с 95-го 25 лет прошло. четверть века. уже новое поколение человеков с нуля выросло.... которое наверно даже не знает видело win95. )))
  21. требуется посчитать золото в граммах ± на ПП. Есть в АД какой нибудь подобный репорт? По идее задача сводится к подсчёту площади золочения меди вскрытой от маски. Как это можно сделать?
  22. в 16 вверху на тулбаре. в 20 возможно там же.
  23. кстати, да.... пользователь может быть русский в кириллице и домашняя папка будет в кириллице.
×
×
  • Создать...