Jump to content

    

juvf

Свой
  • Content Count

    1498
  • Joined

  • Last visited

Community Reputation

0 Обычный

About juvf

  • Rank
    Профессионал

Контакты

  • Сайт
    Array
  • ICQ
    Array

Recent Profile Visitors

5790 profile views
  1. а что дальше? dvb/dmx.h:#include <time.h>, dmx.h может быть включен в asd.h, asd.h включен в dsa.h, ..., ..., ..., ........................... и вот тут device.h включен в mxc.c Как понять по какому именно пути time.h включен в mxc.c?
  2. искать текст "time.h" в фалах "*.h" - найдено 169 файлов". не совсем понял как это сделать..... с мэйком на "вы". Есть мэйкфал с такой строкой obj-$(CONFIG_MXC) += mxc.o как сюда прикрутить -Е?
  3. Есть патченое ядро Linux 4 в исходниках. Компилируется, собирается и работает. в нем есть правки в драйвере /driver/media/bla/bla/bla/mxc.c там используется структура struct timeval cur_time; Структура timeval объявлена в /include/MecTo/rge/HeT/cBeTa/time.h Вопрос: как компилятор из mxc.c достукивается до time.h? Вернее.... я хочу понять, как компилятор включает time.h в mxc.c? через какой путь? Вот какие хидеры в mxc.c #include <linux/version.h> #include <linux/module.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/fs.h> #include <linux/slab.h> #include <linux/ctype.h> #include <linux/clk.h> #include <linux/io.h> #include <linux/semaphore.h> #include <linux/pagemap.h> #include <linux/vmalloc.h> #include <linux/types.h> #include <linux/fb.h> #include <linux/dma-mapping.h> #include <linux/delay.h> #include <linux/mxcfb.h> #include <linux/of_device.h> #include <media/v4l2-chip-ident.h> #include <media/v4l2-ioctl.h> #include <media/v4l2-device.h> #include "v4l2-int-device.h" #include <linux/fsl_devices.h> #include "mxc_v4l2_capture.h" #include "ipu_prp_sw.h" тут "time.h" - нету. Хорошо... заглядываю в <linux/version.h>, там инклудится #include <linux/list.h> #include <linux/stat.h> #include <linux/compiler.h> #include <linux/cache.h> #include <linux/kmod.h> #include <linux/elf.h> #include <linux/stringify.h> #include <linux/kobject.h> #include <linux/moduleparam.h> #include <linux/jump_label.h> #include <linux/export.h> Заглядываю в <linux/list.h>.... потом в <linux/stat.h>.... и пошло поехало... через какие терни time.h инклудится в mxc.c? Есть какие нибудь автоматизированные средства разбора включений?
  4. А что в rxUartStream до printf("TickCount1)? буфер rxUartStream до printf("TickCount1) точно пустой? StreamBuffer описание какое-то неоднозначное. xStreamBufferReceive заблокируется до тригера только при чтении пустого буфера. Т.е. если задача заблокировалась на чтении буфера, то она разблокируется либо через 7 мс, либо через 64 байта. Если буфер был пустой, то задача на нем заблокируется. Но если в буфере был 1 байт, то задача не заблокируется. xStreamBufferReceive() прочитает из rxUartStream все, что там есть, но не более 64. А раз задача не заблокирована, то и тригер мимо. ps глупый конечно вопрос, но 7 - это точно 7 мс? у вас тик == 1 мс?
  5. printf("TickCount1 = %d\n", osKernelGetTickCount()); //debug out j-link numBytes = xStreamBufferReceive( rxUartStream, //Stream Handle (Stream Size = 256 byte, trigger Level = 64) rxUartData, //Recive Buffer 64, //await count data 500 ); printf("TickCount2 = %d\n", osKernelGetTickCount()); //debug out j-link printf("numBytes = %d\n", numBytes); //debug out j-link if(numBytes > 0) { for(int i = 0; i<numBytes; i++) printf("rxUartData[%d] = %d\n", i, rxUartData[i]); //debug out j-link }
  6. Где USB, а где FreeRTOS? То, что вы хотите - это делается, только нет ни какой завязки между ос и usb, так же, как например с UART. Собирайте проект в кубе с USB. Это делается чуть-ли не 2-3 клика мыши, без боли и танцев с бубном (писать ответ сюда - дольше). В итоге у вас будет сгенерирован код в который достаточно вставить 1 строку для вызова своего обработчика. Вот как у меня вышло usbd_cdc_if.c /** * @brief Data received over USB OUT endpoint are sent over CDC interface * through this function. * * @note * This function will block any OUT packet reception on USB endpoint * untill exiting this function. If you exit this function before transfer * is complete on CDC interface (ie. using DMA controller) it will result * in receiving more data while previous ones are still not sent. * * @param Buf: Buffer of data to be received * @param Len: Number of data received (in bytes) * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL */ static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); uint8_t *p = resiveUsbJ(Buf, *Len);//мой внешний обработчик if(p[2] > 0) CDC_Transmit_FS(p, p[2]); //отправка ответа USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); /* USER CODE END 6 */ } Чтобы отправить эхо, вообще внешних методов не нужно (ровно как и ни каких ртос) static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); CDC_Transmit_FS(Buf, *Len);//отправляем эхо USBD_CDC_ReceivePacket(&hUsbDeviceFS); return (USBD_OK); /* USER CODE END 6 */ } Это все крутиться в обработчике. Вам нужно обработку переместить в FreeRTOS? Карты в руки! Полученные данные из CDC_Receive_FS() отправляйте месаджем/флагом/эвентом/симафором/очередью в тред оси, в задаче обрабатывайте и отправляйте обратно в ад UART USB
  7. Стыдно должно быть за такие вопросы. На си нет конечно, звездит. Что там jcxz и чем компилирует - неизвестно. У меня Iar-arm и mingw подавились: multiple definition of `array' ... mingw32-make[1]:... Error 1 Это в стандарте прописано. Пруф - ISO/IEC 9899:2017 6.9 External definitions
  8. почему напрочь отсутствуют проверки? экономия памяти? buffer = netbuf_new(); //netbuf_alloc(buffer,sizeof(msgNode)); if(buffer != 0) { void *p = netbuf_alloc(buffer,5); //netbuf_ref(buf2, data, len); if(p != 0) { buffer->p->payload = msgNode.message; buffer->p->len = 5;//msgNode.size; } else { //NULL if no memory could be allocated } } else { //NULL on lack of memory }
  9. Да скорее всего это не кубу плевать, а эклипсу плевать. Работаю в eclipse+iar plugin. эклипс не свежий.... да и плуг давно ставил... чото торкнуло меня заглянуть в эклипсе в IAR Embedded Workbanch plugin manadger... Обнаружил, что для моего плагина есть у иара обновление. Ну канешь надо обновиться!!! После обновления та же самая картина, что и у ДЕЙЛ: "Открываю окно настроек и вижу ничего.", а также треугольничек жёлтый с восклицательный значком .... подсказка текстом рядом... ОФРАННЫЙ!!! Wtf? Причем сам эклипс не обновлял, только плуг иаровский. (((
  10. char TERMINAL_TEXT[128][256]; ++index &= 0x7f; //или (128-1), или (64-1) uint32_t *pOut = (uint32_t *)&TERMINAL_TEXT[index][0]; uint32_t *pInt = (uint32_t *)rx_buffer; for(uint8_t i=0;i<64;i++) //копируем 256 байт pOut[i] = pInt[i]; ps в 4 раза быстрее.... помните про выравнивание
  11. Флаги в FreeRTOS

    Не совсем понятно, а точнее совсем непонятно зачем отвечать на вопросы ДЕСЯТИ летней давности и предлагать решения, которые были не доступны в 2011 году? 10 лет назад во FreeRTOS не было Event.
  12. Нашел, спасибо. Усреднение за 10-ти минутный интервал.
  13. Всем доброго. Как-то гисметео/gdeduet/windy показывали средний ветер 5-6 м/с (почасовой), а датчик в этом месте показывал то 0.6 м/с, то 7.4 м/с. Причем обновление примерно раз в час. В течении часа 0.6, потом час 7.4. Хотя в реалии ветер был порядка 5 м/с, рваный. Возник вопрос - что это за показания? может порывы ветра? Может этот датчик не усредняет ветер. Мы используем датчики ветра для своей аппаратуры (где сами разрабатываем, где покупаем сторонние). Заглянул в код нашего датчика - идет подсчет оборотов крыльчатки за 4 сек. Пересчет в скорость. Ещё 4 сек подсечет - пересчет... и т.д. УЗ датчики определяют мгновенную скорость гораздо быстрее. Возможно и с крыльчаткой можно определить по другому алгоритму за 1-2 оборота. Так вот, возник вопрос - что такое "средняя скорость ветра"? Перегуглил весь инет - не нашел ответа. Как её определить? Как её определяет гисметео? Например измерение раз в 1 сек, накопление за минуту и усреднение? Или усреднение за 5 мин? или за 10 мин? Кто разрабатывает датчики ветра - как вы вычисляете среднюю V ветра? Может кто поделиться ссылкой на какой-то нормативный документ, где дается определение/расчет из мгновенной скорости? В инете находил определение средней скорости, мол шар скинуть с высоты h, его сдует на расстояние m - вычисляем. Но как его вычислить из мгновенной скорости?
  14. Зачем заводить ещё один модуль? Что такое модуль? У вас в исходном варианте ТРИ группы эвентов (три модуля). Я вам предложил вариант с одиной группой эвентов (с одни модулем). Зачем вы создаёте ещё одну задачу WaitInitTask? Она не нужна. (или это функция.... просто слово Task обычно используют в именах задач) 1) Забудьте про xEventGroupSync 2) создаем 3 задачи - menu, lcd и mem. 3) создаем группу флагов xEventAnyName пусть будет как у вас название xEventMenuStart. Это и будет общая переменная, которая свяжет все 3 задачи. 4) определяем дефайны (необязательно) #define WAIT_EVENT_INIT_MEM (1<<0) #define WAIT_EVENT_INIT_LCD (1<<1) 5) запускаем freertos void vTaskMenu (void *pvParameters){ xEventGroupWaitBits(xEventMenuStart,WAIT_EVENT_INIT_MEM | WAIT_EVENT_INIT_LCD, 0, pdTRUE, portMAX_DELAY); while(1){ MsgDisplayUpdate((uint8_t*)LcdMsgShow.msg,TEXT_NORMAL); vTaskDelay( LcdMsgShow.time/ portTICK_RATE_MS ); } void vTaskLCD (void *pvParameters){ initLCD(); xEventGroupSetBits(xEventMenuStart,WAIT_EVENT_INIT_LCD); ... } void vTaskMEM (void *pvParameters){ initMem(); xEventGroupSetBits(xEventMenuStart,WAIT_EVENT_INIT_MEM); ... } Если у вас есть ещё задачи, и они не должны выполняться до тех пор, пока не проинитится lcd и mem, то другие задачи блокируйте также, как и vTaskMenu xEventGroupWaitBits(xEventMenuStart,WAIT_EVENT_INIT_MEM | WAIT_EVENT_INIT_LCD, 0, pdTRUE, portMAX_DELAY);