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

simark1979

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о simark1979

  • Звание
    Участник
  • День рождения 24.11.1979

Контакты

  • ICQ
    455822802

Информация

  • Город
    Краснодарский край
  1. Динамическое создание/удаление задач

    Цитата(Kabdim @ May 8 2018, 10:45) 1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее? 2. Из прерываний более простые вещи-то не стоит делать. 3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу. 4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься. Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти. Дело в том, что некоторые задачи мне нужно запускать именно заново. Некоторые потоки такие { Включить вывод Пауза 10 Выключить вывод Пауза 20 } А работа потока должна начинаться всегда с включения вывода
  2. Всем здравствуйте) Суть вопроса. Есть некие потоки которые должны создаваться или удаляться в зависимости от от текущих настроек системы. Функция, которая должна делать переконфигурацию запущенных задач при сохранении настроек (может вызываться из прерывания кнопки при сохранении настроек) В этой связи возникло два вопроса, которые я не могу понять. 1. Возможно ли без бубнов узнать по её хэндлу создана ли задача в планировщике и нет? или запоминать в static переменных 2 . Возможно ли создавать/удалять задачи из прерываний или лучше из прерывания нужно семафорить спец задаче, которая этим и займется? Хотелось бы сделать функцию типа такой (которую можно вызывать из прерываний): Кодубиваем задача_1  (если она существует) убиваем задача_2  (если она существует) убиваем задача_3  (если она существует) убиваем задача_4  (если она существует) убиваем задача_5  (если она существует) switch (настройка) {   case 1:      {        создать    задача_2;        создать    задача_3;      }   case 2:      {        создать    задача_3;      }   case 3:      {        создать    задача_1;        создать    задача_2;        создать    задача_5;      } ................... ................... } И вопрос общего характера, стоит ли так делать? или есть другие идеи?
  3. Slave HAL FreeRTOS

    Вобщем написал я эмулятор) Для i2c slave подобного типа получилось написать только на LL, HAL оказался непригоден. В сети на LL примеров практически нет, поэтому примеры ищите в \STM32Cube_FW_L4_V1.11.0\Projects\NUCLEO-L476RG\Examples_LL\ Там много чего есть) Вопрос закрыт, всем спасибо)
  4. Slave HAL FreeRTOS

    А вы никогда не пробовали в Кубе включить для i2c LL драйвер, вместо HAL? Тут какое-то чудо) Я так и не врубился, но слэйв заработал сам собой, своего кода я совершенно не добавлял. Вот так куб мне сгенерил инициализацию: Кодvoid MX_I2C2_Init(void) {   LL_I2C_InitTypeDef I2C_InitStruct;   LL_GPIO_InitTypeDef GPIO_InitStruct;      /**I2C2 GPIO Configuration     PF0   ------> I2C2_SDA   PF1   ------> I2C2_SCL   */   GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;   GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;   GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;   GPIO_InitStruct.Alternate = LL_GPIO_AF_4;   LL_GPIO_Init(GPIOF, &GPIO_InitStruct);   /* Peripheral clock enable */   LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2);     /**I2C Initialization     */   LL_I2C_DisableClockStretching(I2C2);   I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;   I2C_InitStruct.ClockSpeed = 100000;   I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2;   I2C_InitStruct.OwnAddress1 = 208;   I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;   I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;   LL_I2C_Init(I2C2, &I2C_InitStruct);   LL_I2C_SetOwnAddress2(I2C2, 0);   LL_I2C_DisableOwnAddress2(I2C2);   LL_I2C_DisableGeneralCall(I2C2); } Кроме инициализации я ничего не делаю, но после этого у меня лог анализатор начал ловить ответы по шине Cлэйв начал отвечать: забирает и отдает данные (но пока непонятно что это за данные) И непонятно, каким образом это работает при отключенном в Кубе прерываний для I2C2 или в МК реализован полный аппаратный slave автомат....
  5. Slave HAL FreeRTOS

    Цитата(juvf @ Feb 8 2018, 14:32) с халом HALом косяк. См исходники В блокирующем чтении да, не выйдем из приема, пока не получим нужное кол-во байт, либо по таймауту. в неблокирующем режиме по прерываниям, тут ворде можно можно получить переменное кол-во байт. Вызывайте HAL_I2C_Slave_Receive_IT(hi2c, pData, 255); на сколько я понял, в обработчике прерывания не контролируется размер принятых байт. хал в прерывании автоматом будет ловить принятые байты и стоп. После появления STOP-условия прием завершиться и будет вызвана функция void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c). Определите у себя в коде void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c). Кол-во принятых байт 255 - hi2c->XferSize. Из неё отправляйте в таск эвент/флаг/сигнал/мессадж... ps на сколько я понял, если вызвать HAL_I2C_Slave_Receive_IT(hi2c, pData, 2);, а мастер передаст больше 2-х байт, стрельните себе HAL выстрелит вам в ногу. Действительно, по получению меньшего количества данных, приём заканчивается, но вызова HAL_I2C_SlaveRxCpltCallback увы нет, проверил Так что видимо придется использовать LL драйвер
  6. Slave HAL FreeRTOS

    Спасибо Вам, что откликнулись. Извините, что не указал камень (подумал, что для HAL это несущественно) Камень stm32f407 конечно же там аппаратный i2c Сейчас как Вы и предлагаете, прихожу к выводу, что HAL тут неуместен и нужен низкий уровень, но возможно ошибаюсь. У меня вопрос был по реализации протокола именно на HAL_I2C Понятно, как ловить генерацию СтартАдрес/Режим w/r со стороны мастера. Для этого есть HAL_I2C_AddrCallback() Но нет понимания в следующем: Как заставить HAL принять данные от мастера переменной длинны? Все функции HAL_I2C_Slave_Recieve* требую передать количество ожидаемых байт Либо/и Как ловить очередной принятый от мастера байт для анализа? UPD: как поймать Stop. Реализация HAL Slave, очень ограничена, или я чего-то не догоняю?
  7. Slave HAL FreeRTOS

    Товарищи, помогите плиз подступится к реализации Я или устал или это действительно сложно, но никак не могу найти правильный подход к реализации протокола внутри RTOS и HAL. Хоть бы пиночек мне)
  8. Slave HAL FreeRTOS

    Доброе время суток) Извините за наглость но вопрос общего характера. Мне нужно написать эмуляцию часов ds1307. Понятно, что это будет slave, с командами чтения и записи по i2c Никак в голове никак не складывается концепция реализации на FreeRTOS (имеется ввиду взаимодействие коллбэков и потоков, как распознать команды чтения/записи) На картинке, пример работы с ds1307: packet#27 - так происходит запись (первый байт куда писать, остальные что писать) packet#28 - установка указателя для чтения packet#29 - чтение данных Вообщем протокол стандартный. [attachment=111023:rtc.PNG] Может у кого-то есть опыт или идеи по написанию слэйва под операционкой? Буду рад любой помощи)
  9. Цитата(Владивольт @ Feb 5 2018, 22:07) Попробовать если 3.1.16 Bus clear Тема тоже актуальная, но там речь идет от том когда slave прижимает SDA и в этот момент происходит перезапуск мастера и мастер клокать перестает. А slave то ждет клок и до потери пульса будет держать SDA в прижатом состоянии. Для того чтобы вернуть себе шину, мастер должен проклокать, пока SDA не отпустят. А далее начинать работу с шиной заново. Я с этой фигней столкнулся, но решил экспериментальным путем. Но спасибо, это была интересная информация для меня Цитата(Aleksandr Baranov @ Feb 5 2018, 22:23) А нельзя ли действовать в такой последовательности: i2C Disable ->Devices Reset ->i2C Enable? Когда Вы сбрасываете устройство, оно может свести с ума Ваш процессор непредсказуемым сочетанием сигналов на шине. Вообще для меня это очень неприятная новость, что так ведут себя слэйвы при старте (их программировал мой бывший сотрудник). Ведь любая перезагрузка одного из слэйвов, может подвесить всю шину. Как Вы предлагаете я пробовал, но в этом случае сначала по шине приходит TIMEOUT, а далее опять BUSY......и обе линии кто-то прижимает. пока не понял в чем дело Очевидный вывод из этой истории: если пишем slave i2c устройство, нужно его правильно инициализировать. Чтобы при своем запуске они не дергали SDA/SCL дабы не подвесить всю шину.
  10. Цитата(0men @ Feb 5 2018, 19:48) так вы залезьте внутрь HAL_I2C_Master_Receive и посмотрите причину HAL_BUSY. Там не так много вариантов Спасибо за пинок в нужном направлении, сейчас выяснил, что все-таки во время сброса slave устройств кто-то из них кратковременно дважды притягивает обе линии к земле, в следствие чего у регистра I2C_SR2 выставляется бит 1 в единицу. А в DM00031020.pdf на стр 872 написано. 1 BUSY: Bus busy 0: No communication on the bus 1: Communication ongoing on the bus – Set by hardware on detection of SDA or SCL low – cleared by hardware on detection of a Stop condition. It indicates a communication in progress on the bus. This information is still updated when the interface is disabled (PE=0). Теперь вопрос, как это дело похерить....
  11. Здравствуйте, у меня тут ребус У мастера stm32f407 на i2c шине висят slave устройства. У мастера есть пин, которым он может сделать аппаратный сброс этих устройств (всех сразу). При зависании одного из slave устройств, мастер должен прекратить работу на шине, дернуть за сброс, возобновить работу по шине. А непонятка в следующем: какого-то хрена сброс slave устройств и дальнейшая работа по шине возможна только во время старта мастера, но до инициализации шины i2c. А когда мастер уже инициализировал свою шину, тогда после сброса slave устройств дальнейшая работа по шине невозможна (вызов HAL_I2C_Master_Receive возвращается с ошибкой HAL_BUSY) =============================================================== Такая последовательность запуска мастера работает: HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_UART4_Init(); MX_USART1_UART_Init(); reset_i2c3m_subsystems(); MX_I2C3_Init(); MX_RTC_Init(); MX_I2C2_Init(); MX_I2C1_Init(); далее работа по шине идет нормально ....................................................... =============================================================== Такая последовательность запуска мастера НЕ работает: HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_UART4_Init(); MX_USART1_UART_Init(); MX_I2C3_Init(); reset_i2c3m_subsystems(); MX_RTC_Init(); MX_I2C2_Init(); MX_I2C1_Init(); HAL_I2C_Master_Receive возвращает HAL_BUSY .................................................................... ================================================================ Содержимое функции сброса простое. void reset_i2c3m_subsystems(){ //HAL_I2C_MspDeInit(&hi2c3); // Не помогает HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_RESET); HAL_Delay(10); HAL_GPIO_WritePin(RST_DEV_GPIO_Port, RST_DEV_Pin, GPIO_PIN_SET); HAL_Delay(100); //HAL_I2C_MspInit(&hi2c3); //не помогает } ================================================================= ================================================================= Обнаружил, что работе шины мешает сброс устройств именно после инициализации SCL. Функция ниже вызывается из MX_I2C3_Init(): void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle){ ............................................................................. ............................................................................. /**I2C3 GPIO Configuration PC9 ------> I2C3_SDA PA8 ------> I2C3_SCL */ ............................................................................. ............................................................................. >>> Если сброс slave устройств сделать здесь, шина будет работать GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); >>> Если сброс slave устройств сделать здесь, шина работать НЕ будет ............................................................................. ............................................................................. } На осциллографе до и после инициализации шины изменений не видно, линии к земле не прижаты Уже башку сломал
  12. I2C HAL DS2482

    Цитата(Lagman @ Feb 1 2018, 10:55) Можете посмотреть на реализацию в HAL функций: HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); Не смотрите на их название, они как раз делают такие вещи, выдают адрес устройства и байты откуда считать или записать и потом без стопа происходит считывание или запись, по поводу uint16_t MemAddress если указать в uint16_t MemAddSize = I2C_MEMADD_SIZE_8BIT то он будет 8 битный и будет отправляться один байт. Если имя функций смущает, напишите для них свои имена. :-) ............................................................. Спасибо, я про эти функции в курсе. Но они тоже бы не подошли. Смысл работы с этой микросхемой иногда сводится к тому, чтобы: послать команду, а далее постоянно вычитывать и анализировать байт состояния (он будет приходить снова и снова), по которому можно понять выполнилась команда на шине 1wire или нет. HAL_I2C_Mem_Read_IT заранее должна знать сколько нужно читать..... Короче немного не то, но всё равно спасибо UPD: извиняюсь, только дошло, что Вы предлагали написать свои функции, подглядывая на реализацию HAL_I2C_Mem_*. Можно было бы и так Но проблема снята сама собой, использую стандартные функции HAL_I2C_Master_Transmit и HAL_I2C_Master_Receive. Микросхема их отлично понимает.
  13. I2C HAL DS2482

    Возвращаясь к теме топика) Докладываю, что в документации на ds2482 указана неточность, мол после отправки команды сразу нужен Repeated Start, после чего следует читать регистр состояния. Микросхема нормально работает и со СТОПом мужду посылками Цитата(0men @ Jan 31 2018, 20:28) исправлено: Repeated здесь не будет, но скажите страницу в доке где он так необходим? Строку с Repeated можно разбить на 2 отдельные посылки https://datasheets.maximintegrated.com/en/ds/DS2482-100.pdf страница 18, примеры
  14. I2C HAL DS2482

    Цитата(Forger @ Jan 31 2018, 22:13) Сильно напомнило мне эту тему: https://electronix.ru/forum/index.php?showtopic=144401 Щас будете еще больше смеяться Когда я взял его исходники и начал разбираться что и как, я лазил в инете и наткнулся на это https://geektimes.ru/post/293505/ Когда читал, удивлялся, что очень всё похоже на наше А когда прочитал до конца, обнаружил, что автор ОН самый. Если цензура не зарубит) я это классифицирую как "промышленный онанизм"
  15. I2C HAL DS2482

    Цитата(Forger @ Jan 31 2018, 21:55) Чего-то я не понял - два программиста для одной железки? Грустная история Обычно в конторах двух конфликтующих разрабов "разносят" по разным проектам и кабинетам. А тут - судя по всему, все наоборот ... Если не секрет, то просветите. А то вдруг пригодится на будущее Немного не так было) Я хозяин конторы, программировать умел на начальном уровне, но из-за нехватки времени нанял программиста, ПО писал он. У меня были другие задачи. Но товарищ затащил проект в болото (по причине изобретений велосипедов) и ввиду болезненного самолюбия любил заниматься шантажом. Вот и расстались. Теперь занимаюсь этими вопросами я.