Вопросы с тегами [rtos]

0

голосов
0

ответ
2

Просмотры

Установка встраиваемая существенно libnuma-DEV для cyclictest в настраиваемой RedHat Linux?

Так как я хочу, чтобы проверить производительность настроенного RedHat Linux (RTOS) с набором инструментов к.т.-тест, я должен установить встроенный существенно и libnuma-DEV первый в соответствии с инструкцией по эксплуатации. Тем не менее, настроенный RedHat RT Linux не зарегистрирован в RHN, так что я не могу установить две библиотеки RT-тест опирается на с помощью команды ня. Хорошей новостью является то, что аппарат находится в моей руке, и я знаю его аппаратную конфигурацию и его версию Linux ядра. Итак, мой вопрос, как я могу установить сборки заменимых и libnuma-DEV в автономном режиме?
foool
1

голосов
1

ответ
139

Просмотры

Какова цель функции xTaskAbortDelay в свободном ОСРВЕ?

У меня есть две задачи, в которых я receving данные Bluetooth и если я получаю определенное шестнадцатеричное значение, я хочу задачу (которая переключая LED государство) для запуска на основе полученных данных. Если бы не было никаких данных, полученных, то обе задачи должны работать в соответствии с их графиком. Я пытался использовать функцию xTaskAbortDelay, задача мчит от входа с блютуз данных, однако, после того, что LED задача выполняется непрерывно. Есть ли xTaskAbortDelay создать некоторые проблемы здесь? Должен ли я использовать что-то другое, чтобы достичь той же функциональности? TaskHandle_t lora_send_data_handle; TaskHandle_t ble_send_data_handle; TaskHandle_t test_data_handle; статическая сила button_task_check (недействительный * pvParameter) {TickType_t xLastWakeTime; Const TickType_t xFrequency = 1024; xLastWakeTime = xTaskGetTickCount (); в то время как (1) {nrf_delay_ms (100); SEGGER_RTT_printf (0, "% s", "ВНУТРИ КОММУТАЦ \ г \ п"); xTaskAbortDelay (test_data_handle); vTaskDelayUntil (& xLastWakeTime, (TickType_t) 1024); }} / * Задание будет выполнено СВД ПРОВЕРКА * / статический недействительным led_task_check (недействительными * pvParameter) {TickType_t xLastWakeTime; Const TickType_t xFrequency = 122880; xLastWakeTime = xTaskGetTickCount (); в то время как (1) {SEGGER_RTT_printf (0, "% s", "ТЕСТ ЗАДАЧА \ г \ п"); nrf_gpio_pin_write (КРАСНЫЙ, 1); nrf_gpio_pin_write (ЗЕЛЕНЫЙ, 1); nrf_gpio_pin_write (СИНИЙ, 1); nrf_gpio_pin_write (КРАСНЫЙ, 0); nrf_gpio_pin_write (ЗЕЛЕНЫЙ, 1); nrf_gpio_pin_write (СИНИЙ, 1); nrf_delay_ms (1000); nrf_gpio_pin_write (КРАСНЫЙ, 1); nrf_gpio_pin_write (ЗЕЛЕНЫЙ, 0); nrf_gpio_pin_write (СИНИЙ, 1); nrf_delay_ms (1000); nrf_gpio_pin_write (КРАСНЫЙ, 1); nrf_gpio_pin_write (ЗЕЛЕНЫЙ, 1); nrf_gpio_pin_write (СИНИЙ, 0); nrf_delay_ms (1000); nrf_gpio_pin_write (КРАСНЫЙ, 0); nrf_gpio_pin_write (ЗЕЛЕНЫЙ, 0); nrf_gpio_pin_write (СИНИЙ, 0); nrf_delay_ms (1000); vTaskDelayUntil (& xLastWakeTime, (TickType_t) 122880); }} Int основной (вакуум) {uint8_t rx_qspi [255]; SEGGER_RTT_printf (0, "% s", "Сброс \ г \ п"); nrf_delay_ms (100); xQueue1 = xQueueCreate (1, 30); ret_code_t err_code; err_code = nrf_drv_clock_init (); SEGGER_RTT_WriteString (0, err_code); UNUSED_VARIABLE (xTaskCreate (button_task_check, "т", \ configMINIMAL_STACK_SIZE + 200, NULL, 3, & lora_send_data_handle)); UNUSED_VARIABLE (xTaskCreate (led_task_check, "Et", \ configMINIMAL_STACK_SIZE + 200, NULL, 2, & test_data_handle)); vTaskStartScheduler (); в то время как (1); }
1

голосов
1

ответ
107

Просмотры

FreeRTOS - vTaskList неопределенная ссылка

Я пытаюсь использовать функцию vTaskList для мониторинга используются задачи. Для того, чтобы использовать vTaskList, настроить макрос ниже. #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 и ниже код задачи, чтобы отобразить список задач. TASK_LIST недействительными () {подписан символ pWriteBuffer [2048]; для (;;) {vTaskList (pWriteBuffer); Е ( "task_name TASK_STATE приоритет стека tasK_num \ п"); Е ( "% s \ п", pWriteBuffer); } VTaskDelete (NULL); вернуть; } Однако, ошибка просто появилась на неопределенные ссылки, что вызвало эту ошибку? Спасибо. Ps. Для моей первоначальной ситуации, нет макросов для configUSE_STATS_FORMATTING_FUNCTIONS в FreeRTOSConfig.h. поэтому я добавить его вручную.
黃銘賢
1

голосов
1

ответ
1.2k

Просмотры

Рекомендации по использованию гипервизора для запуска в режиме реального времени OS параллельно с Windows / Linux

Каковы ваши советы / опыт использования гипервизора (например, РТС в режиме реального времени гипервизора), чтобы запустить RTOS параллельно с не в режиме реального времени ОС. Существует ли какое-либо влияние на производительности? Существуют ли какие-либо риски? (Например, как вы можете убедиться в том, что не в реальном масштабе времени операционная система не будет вмешиваться в реальном времени аспекты RTOS) Из того, что я понимаю, двухъядерный (или гиперпоточность) CPU должен быть использован так, что вы можете присвоить каждой ОС свой собственное ядро.
Tobias Furuholm
1

голосов
1

ответ
451

Просмотры

Использование embOS функции в USB ISR для LPC1788

Я занимаюсь разработкой программного обеспечения для микроконтроллеров NXP LPC1788, и я использую embOS RTOS. Всякий раз, когда сообщение получено через USB, я хочу использовать функцию OS_PutMailCond (), чтобы сохранить сообщение USB в почтовом ящике, который функция обработчика ждет дальше. Другими словами, я хочу, чтобы сделать обработку сообщений на основе прерываний. Руководство пользователя embOS можно найти здесь. Страница 145 описывает функцию OS_PutMailCond (). Всякий раз, когда получено сообщение USB, он запускает USB службы обработки прерывания на LPC, но чтобы embOS знать, что это ISR я должен поместить OS_EnterInterrupt () и OS_LeaveInterrupt () в начале и в конце ISR соответственно. Это необходимо, если я хочу вызвать embOS функции в нем, в том числе OS_PutMailCond (). Проблема заключается в том, что если я ставлю OS_EnterInterrupt () / OS_LeaveInterrupt () в любом месте USB ISR, USB-перестает функционировать должным образом, и Windows, сообщает мне, что устройство сбоев. Я понятия не имею, почему это так. Мы пытались что-то подобное для обработки сообщений по CAN, как показано ниже, и она отлично работает. аннулированию CAN_IRQHandler (пустот) {OS_EnterInterrupt (); ... если (MBfieldCANframeInitialised) OS_PutMailCond (& MBfieldCANframe, & recMessage); OS_LeaveInterrupt (); } OS_EnterInterrupt () и OS_LeaveInterrupt () описаны на страницах 252 и 253 из связанного руководства. С дополнительной информацией о разделе бывших: Если OS_EnterInterrupt () используется, она должна быть первой функцией, которая будет вызван обработчиком прерываний. Он должен быть использован с OS_LeaveInterrupt () в качестве последней вызванной функции. Использование этой функции имеет следующие эффекты, это: отключает выключатели задач сохраняют прерывания во внутренних процедурах инвалидов EDIT Я исследовал дальше и обнаружил, что с помощью OS_EnterInterrupt () и OS_LeaveInterrupt () в USB-ISR (и другие ISR как один для GPIO, когда нарастающий или спадающий фронт обнаружен на ниппель) вызывает ошибку ОС. Значение ошибки 166, что означает «ОС-функция вызывается из ISR с высоким приоритетом». Я буду обновлять, если я узнаю что-нибудь еще.
Tagc
1

голосов
2

ответ
3.7k

Просмотры

создавая задачу внутри другой задачи в FreeRTOS

Я новичок RTOS и я создаю простую систему реального времени для автомобильного я интересно, если это возможно, чтобы создать задачу внутри другой задачи. Я пытался сделать это с помощью следующего метода, но он не работает. аннулированию vTask1 {* pvParameters) {неподписанных portBASE_TYPE taskPriority; taskPriority = uxTaskPriorityGet (NULL); символ х; в то время как (1) {х = 5; если (х == 5) xTaskCreate (vTask2, "task2", 1000, "task2 управлением", taskPriority + 5, NULL); } Когда я отладки этого кода он висит на xTaskCreate без выполнения новой задачи, и я искал руководство и интернет на что-то об этом, но я не нашел. бы кто-нибудь сказать мне, что можно сделать в ОСРВ или я делаю это в неправильном направлении?
Mohamed El Shenawy
1

голосов
2

ответ
726

Просмотры

Keil RTX RTOS размер стека потока

В файле конфигурации Keil RTX RTOS, пользователь может настроить пользователя по умолчанию размер стека нити. В общем, стек имеет авто / локальные переменные. В разделе «ZI данные» имеет неинициализированные глобальные переменные. Так что, если я изменю пользователь нить размер стека в файле конфигурации RTX, размер стека будет увеличиваться и «ZI данных» размер раздела не будет увеличиваться. Я проверить это, результат теста показывает, что если я увеличить размер пользовательского стека потока. «ZI данные» размер раздела будет синхронно увеличиваться с таким же размером. В моей тестовой программе, есть 6 нитей и каждый из них имеет 600 байт стека. Я использую Keil построить программу, и она показывает мне, что: Код (вкл. данных) RO данных RW данных отладки ЗИ данных 36810 4052 1226 380 6484 518461 Гранд Итоговые 36810 4052 1226 132 6484 518461 ELF Totals Image (сжатый) 36810 4052 1226 132 0 0 ROM Итоги ============= ================================================== =============== Общий размер RO (Код + RO данных) 38036 (37.14kB) Общий размер RW (RW данных Data + ЗИ) 6864 (6.70kB) Общий размер диска (Код + RO Data + RW Data) 38168 (37.27kB) Но если я изменил каждый размер стека потока до 800 байт. Keil показывает мне следующим образом: ============================================ ================================== Code (вкл. данных) RO данных RW данных отладки ЗИ данных 36810 4052 1226 380 7684 518461 Гранд Итоговые 36810 4052 1226 132 7684 518461 ELF Totals Image (сжатый) 36810 4052 1226 132 0 0 ROM Итоги ============= ================================================== =============== Общий размер RO (Код + RO данных) 38036 (37.14kB) Общий размер RW (RW данных Data + ЗИ) 8064 (7.88kB) Общий размер диска (Код + RO данных + RW, данные) 38168 (37.27kB) ======================================= ======================================= «ЗИ данные» размер раздела увеличение по сравнению с 6484 до 7684 байтов. 7684 - 6484 = 1200 = 6 * 200. И 800 - 600 = 200. Таким образом, я вижу стек нить помещается в "З.И. данных" раздел. Мой вопрос: Означает ли это, авто / локальные переменные в потоке будут помещены в разделе «ZI данных», когда стек потока помещается в разделе «ZI данные» в оперативной памяти? Если это правда, это означает, что нет раздела стека на всех. Есть только «RO / RW / ZI данные» и секция кучи вообще. Эта статья дает мне другой ответ. И я теперь немного запутался об этом. https://developer.mbed.org/handbook/RTOS-Memory-Model
in_summer
1

голосов
2

ответ
1.3k

Просмотры

«Исключение неисправности Использование» в ARM Cortex M

Я присутствовал на лекции по Freertos и Cortex M, где инструктор посоветовал, что если ISR безопасный вариант API не используется из ISR, это может привести к исключению неисправностей Использование в Cortex M processors.This будет происходить, потому что это может включать в себя переход от контекста прерывания (прерывание обработчик) в контексте задачи (обработчик нить) Мой вопрос, почему этот переключатель задача будет считаться незаконным и каковы будут последствия такого переключения?
Furqan Qadri
1

голосов
1

ответ
169

Просмотры

Nuttx: зачем нужен опрос для потоков очередей работы?

В рабочие потоки Nuttx (LP и HP) имеют интервал опроса, только для рабочего потока 0. Я задаюсь вопросом, почему интервал опроса нужен? Когда кто-то ставит в очередь новую работу в рабочую очередь, рабочий поток будет сигнализировать справиться с этим. И если все рабочие потоки были заняты, очередь работа будет обрабатываться, когда поток завершил текущую работу и снова проверяет очередь. Как о sched_garbage_collection () работы, рабочие потоки сигнализируют sched_signal_free (). Так что в случае, когда требуется интервал опроса? Кажется, сигналы достаточно хороши, чтобы убедиться, что рабочие потоки всегда ног обрабатывать произведения.
Lin Xuan
1

голосов
2

ответ
0

Просмотры

Что Передача параметров в стек в ОСРВ?

Я новичок в ОСРВ «ве вокруг несколько месяцев опыта на стороне системы (сторона приложения) программирования в C / C ++. Но входя в этот встроенный домен, я наткнулся на несколько вопросов. Что означает Передача параметра в задаче? Я не понял ниже приведенного примера. статическая сила TaskEx (недействительный * PDATA) {в то время как (1) {OS_Delay ((OS_TIME) PDATA); }} Пустота OS_CreateTask (OS_TASK * pTask, символ * PNAME, символ без знака приоритета, voidRoutine * pRoutine, недействительным * pStack, без знака STACKSIZE, символ без знака TimeSlice); OS_CreateTask (& TaskMain, NULL, 50, TaskEx, StackMain, SizeOf (StackMain), 2); // ^ Это не передавая параметр является задачей. аннулированию OS_CreateTaskEx (OS_TASK * pTask, символ * PNAME, символ без знака приоритета, voidRoutine * pRoutine, недействительным * pStack, без знака STACKSIZE, символ без знака TimeSlice, недействительным * pContext); OS_CREATETASK_EX (& TCBLP, "LP Задача", TaskEx, 50, StackLP, (недействительными *) 200); // ^ Это пропускание параметра является задачей. Я знаю, что для определения стека в обычном программировании C. Но в ОСРВ, я не понял, стеком, который Вы определяете должен находиться в зоне, что процессор может реально использовать в качестве стека?
Rahul
1

голосов
2

ответ
1.9k

Просмотры

Доступ к VxWorks Target Shell

Я хочу задать вопрос, связанный с Tornado / VxWorks 5.4 Я хотел бы получить доступ к VxWorks целевой оболочки, которая работает под моим встроенным выключателем. Я использую Торнадо с VxWorks 5.4 ядра. В Торнадо есть WindSh (Host Shell), который я могу получить доступ непосредственно из самого Tornado IDE. Однако мой вопрос, как я могу получить доступ к целевой скорлупе? В некоторых местах они говорят, что может быть сделано через последовательный порт, однако не существует последовательный интерфейс непосредственно в моем встроенном устройстве. Я также пытался сделать это с помощью Telnet или FTP, но он также не работает. У вас есть какие-нибудь предложения? Спасибо за ваши ответы заранее. С уважением, Альпер
Alper Kultur
1

голосов
1

ответ
485

Просмотры

Как проверить хост и цели на одной и той же сети?

Я хочу подключить машину ОСРВ QNX Neutrino (цель) к сети и моя машина развития (состоит из QNX Momentics IDE) также должны быть на одной и той же сети. Пожалуйста, скажите мне шаги, чтобы проверить, что оба хозяина и цель находятся на одной и той же сети?
user3138207
1

голосов
2

ответ
391

Просмотры

Запись на флэш-диск для встроенной ОС на ATmega328P (h8write эквивалент АВР)

Я сейчас читаю японскую книгу на встроенном OS / RTOS эс кроме того, что я не использую рекомендуемое оборудование, как я уже имел seeeduino микроконтроллера. (ATmega328P) Книга о KOZOS «12 шагов, чтобы сделать Ваш собственный встроенный OS» на Sakai Хироаки (Это Хиро-то) я застрял в той части, где мне нужно написать в флэш-ПЗУ ATmega328P, поскольку автор использует другой чип под названием Н8. Он использует программное обеспечение под названием h8write и использует в своей ОС, но я честно не имеют ни малейшего представления о том, что происходит в данный момент, и то, что замена АРН для h8write будет. Я огляделся без толка, как есть минимальная документация о том, что h8write делает в стороне от «он помогает вам писать флэш-ROM», который показывает в книге. Это первый раз, когда я делаю нижний материал слоя и его»
Spaghet
1

голосов
1

ответ
345

Просмотры

Использование RtosTimer внутри класса

Я пытаюсь использовать RtosTimer в классе, но в mbed запирает. Я думаю, это потому, что я звоню threadHelper каждый тик и его создания нового указателя в то время как я на самом деле хочу называть threadMethod каждый тик или позвонить threadHeper каждый тик, но использовать один и тот же указатель. Может кто-нибудь показать мне, как я должен делать это? Приведенный ниже код работает для RtosThread, потому что threadHelper вызывается только один раз, но мне нужно использовать таймер RTOS. .h #ifndef TEST_CLASS_H #define TEST_CLASS_H #include "mbed.h" #include "rtos.h" / ** TestClass класс. * Используется для демонстрации вещей. * / Класс TestClass {общественности: / ** Создание объекта TestClass с заданными особенностями * * @param светодиод Светодиодный контактный. * @Param flashRate Скорость блеснуть светодиод на в Гц. * / TestClass (PinName водить, плавать flashRate); / ** начинает мигать светодиод с помощью резьбы * / недействительным старт (); частные: // переменные-члены DigitalOut m_Led; плавать m_FlashRate; RtosTimer * m_rtosTimer; // Внутренние методы статической силы threadHelper (сопзЬ пустота * Arg); аннулированию threadMethod (); }; #endif CPP #include "TestClass.h" TestClass :: TestClass (PinName привело, поплавок flashRate): m_Led (во главе, 0), m_FlashRate (flashRate) {// Примечание: RTOS еще не началась, так что мы можем» т создать внутреннюю резьбу здесь} недействительный TestClass :: Start () {m_rtosTimer = новый RtosTimer (& TestClass :: threadHelper, osTimerPeriodic (пустота *) 0); INT updateTime = (1,0 / m_FlashRate) * 1000; m_rtosTimer-> начать (updateTime); } недействительным TestClass :: threadHelper (сопзИте пустоту * Arg) {// Cast аргумент к TestClass экземпляр указатель TestClass * экземпляр = (TestClass *) Arg; // Вызов метода потока для экземпляра экземпляра TestClass -> threadMethod (); } Аннулируются TestClass :: threadMethod () {// Выполняем некоторые вещи} Спасибо
Joseph Roberts
1

голосов
1

ответ
286

Просмотры

Если sigwait () блоки, когда принимаемый сигнал фактически «выбран»?

Есть два в режиме реального времени потоки. Первый имеет низкий приоритет и ждет всех возможных сигналов в sigwait () (так что все сигналы блокируются и sigmask передается функции имеет все сигналы включены). Второй имеет высокий приоритет и посылает два сигнала на первый (низкий приоритет) нить - это сначала посылает SIGRTMAX, а затем SIGRTMIN. POSIX спецификации для sigwait () (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html) говорит: если нет сигнала в наборе не находится на рассмотрении в момент вызова, нить не должна быть приостановлена ​​до тех пор, один или более переходит в режим ожидания. [...] Если какой-либо из множества ожидающих сигналов в диапазоне SIGRTMIN к SIGRTMAX быть выбран, он должен быть наименьшим номером один. Последовательность событий в операционной системе реального времени будет выглядеть так: (H) ............... сигнал (SIGRTMAX) === сигнал (SIGRTMIN) === .. , (L) === sigwait () ......................................... === ^ ^ ^ ^ 1 2 3 4 (Н) - высокий приоритет потока (L) - низкий приоритет потока. - нить не работает = - поток выполняется 4 интересных моментов: низкий приоритет поток блоки на sigwait (), никаких сигналов не в настоящее время на рассмотрение, все сигналы блокируются, высокий приоритет поток еще не начался; высокий приоритет начинает нить и посылает сигнал SIGRTMAX с низким приоритетом нити, которая разблокирована, но не разрешено работать, поскольку высокий приоритет поток все еще работает; высокий приоритет поток продолжает работать и посылает сигнал SIGRTMIN с низким приоритетом потока, но низкий приоритет поток все еще ждет, чтобы реально работать; высокий приоритет поток завершается, низкий приоритет потока разрешено запускать и возвращать из sigwait () вызов; Теперь проблема заключается в том, что если оба SIGRTMIN и сигналы SIGRTMAX находятся на рассмотрении в то же время, SIGRTMIN должен быть «выбран» первым. Однако я не уверен, в какой момент сигнал действительно «выбран» - выбирается его ядро ​​на «2» или, может быть выбран с помощью кода в sigwait (), выполненном в потоке с низким приоритетом, так что на «4»? Вот почему я не уверен, является ли в приведенном выше сценарии, вызов sigwait () будет на самом деле выбрать SIGRTMIN или SIGRTMAX. Может быть, такие детали «определяется реализацией»? Вопросы находится в Сопутствующие операционной системы реального времени для микроконтроллеров я разрабатываю (https://github.com/DISTORTEC/distortos). В настоящее время мой код «выбирает» сигнал во время генерации, и поэтому на «2»
Freddie Chopin
1

голосов
1

ответ
377

Просмотры

Почему оболочка не является частью RTOS коды?

Я вижу много ОСРВА (Ex Nuttx) имеет оболочку в качестве приложения. Является ли это просто соглашение в RTOS, чтобы сохранить не очень важный код вне RTOS, чтобы минимизировать размер кода? Не обстреливать часть ОС в Linux? Почему не должны раскошеливаться быть внутри кода операционной системы в качестве модуля, как менеджер памяти, и т.д.? Если переместить код оболочки внутри ОСРВ быть частью ОСРВ & inited и запущен, как и любой другой модуль RTOS, будет ли проблема?
sniper
1

голосов
3

ответ
73

Просмотры

Multithreded приложение на разных процессорах

Если, например, есть, скажем, встроенные приложения, которые работают на UNICORE CPU. А затем, что заявка будет портирована на многоядерном CPU. Будет ли, что приложение работает на одном или нескольких ядер? Чтобы быть более конкретным Я заинтересован в ARM процессор (но не только), а также особенности Toolchain например, стандартные библиотеки C / C ++. Цель этого вопроса заключается в следующем: это ответственность КПУ на «решить», чтобы выполнить на нескольких ядрах или утилит компилятора, разработчик и стандарт platfor конкретных библиотек? И опять же, я заинтересован также в тенденции других систем там. Есть много приложений и ОС реального времени (например, Linux), которые работают на разных процессорах, но те же архитектуры, так это значит, что они составлены по-разному?
1

голосов
1

ответ
106

Просмотры

Какие параметры, по которым сравниваются RTOS?

Я хочу, чтобы сравнить два RTOS (например -> Keil-RTX, УКО-III и FreeRTOS), но я не знаю, на какие параметры мне нужно, чтобы сравнить их, например, объем памяти, сертифицированные и т.д., на которых точка делать сравнить RTOS?
G.ONE
1

голосов
1

ответ
99

Просмотры

Confusion with thread synchronization [pthreads]

I have had a problem threads for a long time. This code is supposed to have a worker thread increment the value of a shared integer while the main thread prints it out. However, I am not getting my expected output. #include #include #include pthread_mutex_t lock; int shared_data = 0; //shared data // Often shared data is more complex than just an int. void* thread_function(void* arg) { int i; for (i = 0; i < 10; ++i) { // Access the shared data here. pthread_mutex_lock(&lock); shared_data++; pthread_mutex_unlock(&lock); } return NULL; } int main(void) { pthread_t thread; int i; void* exit_status; // Initialize the mutex before trying to use it. pthread_mutex_init(&lock, NULL); pthread_create(&thread, NULL, thread_function, NULL); // Try to use the shared data. for (i = 0; i < 10; ++i) { sleep(1); pthread_mutex_lock(&lock); printf ("\r for i= %d Shared integer 's value = %d\n", i, shared_data); pthread_mutex_unlock(&lock); } printf("\n"); pthread_join(thread, &exit_status); // Clean up the mutex when we are finished with it. pthread_mutex_destroy(&lock); return 0; } Here is what I expect: for i=0 Shared Integer 's value = 0 for i=1 Shared Integer 's value = 1 for i=3 Shared Integer 's value = 2 ... for i=10 Shared Integer 's value =10 but the result is: for i=0 Shared Integer 's value = 0 for i=1 Shared Integer 's value = 10 for i=3 Shared Integer 's value = 10 ... for i=10 Shared Integer 's value =10 so how can i resoleve this?
azert123
1

голосов
1

ответ
65

Просмотры

Почему Zephyr RTOS от Linux Foundation, использует лицензию Apache?

Зефир RTOS https://www.zephyrproject.org/ проект Linux Foundation. И Linux хорошо известна своей лицензии GPL. Почему тогда Zephyr RTOS использует Apache 2 лицензии? (Как это влияет на усыновитель / пользователи этой новой ОС?)
pfalcon
1

голосов
2

ответ
182

Просмотры

Многоядерный ARM: как назначить критическую задачу одному выделенному ядра

Предположим, встроенный системный проект, где у меня есть многоядерный процессор ARM (чтобы сделать его простым предположить, 2 ядра с неподеленной кэша между 2 ядрами). Предположу, что моя система содержит критическую задачу и несколько некритических задач. Таким образом, я могу назначить критическую задачу «ядро 1» исключительно? И все остальные на «ядро 2» исключительно? Если да, то как это сделать и каковы лучшие практики с точки зрения реализации [предположим, я использую C]? Должен ли я использовать библиотеку (если да, один)? RTOS?
S12000
1

голосов
2

ответ
82

Просмотры

мигает nuttx RTOS в stm32F4developer из окон

Я установил терминал Ubuntu, как теперь для Windows 10 поддерживает его. Я построил Nuttx RTOS с помощью терминала, но в Ubuntu я не могу получить доступ к USB-устройствам для привода ручки, за исключением. Как прошить файл бен stm32f4developer?
Mohamed Vakkayil
1

голосов
2

ответ
1.2k

Просмотры

PowerPC: Как сделать DIV / 0 возвращение нуля в результате

Мы пытаемся порт унаследованного приложения от старого монолитного ОСРВА, основанных на Unix ОС реального время на PowerPC 8360. В старой системе, наша большая база коды стала зависеть от 1/0 возвращения к нулю, и 0/0 возвращение к нулю. Теперь в новой операционной системе 1/0 возвращает РСМД и 0/0 возвращает NaN, который разрушает наше приложение. Мы пробовали играть вокруг с FPSCR зарегистрироваться без каких-либо результатов. Во-вторых, если есть способ изменить его, может изменить принять влияют на наш процесс приложения, а не всю систему? Мы не хотим, чтобы изменить DIV / 0 поведение других приложений в системе. Предвидя неизбежное «почему вы делаете это таким образом» вопрос, мы должны сохранить прежнее поведение таким образом изменяя приложение на самом деле не делить на ноль из вопроса. Это больное место с нами так, пожалуйста, воздержитесь от вопроса.
ADogg
1

голосов
3

ответ
1.1k

Просмотры

Linux RTOS сна () - пробуждение () для задания таймера

У меня есть задача, которая в основном ТАЙМЕР; поэтому он идет спать и должен просыпаться периодически .. Таким образом, задача таймера спит скажем 10мс. Но то, что происходит в том, что он непоследователен в пробуждении и не может полагаться пробуждать вовремя правильно. На самом деле, в моих пробегах, есть большая разница в время сна. Иногда это может варьироваться в зависимости от 1-2 мс в пробуждении и очень мало времени не вернется к вообще. Это происходит потому, что ядро ​​планировщик помещает все спальные и ожидания задачи в очереди, а затем, когда он опрашивает, чтобы увидеть, кто должен пробудиться, я думаю, что это круговой. Поэтому иногда задача истек бы к тому времени, планировщик опрашивает снова. Иногда, когда есть прерывания, то ISR получает управление и задерживает таймер от пробуждения. Что является лучшим решением для обработки такого рода проблем? (Дополнительные детали: Задача таймер MAC для работы в беспроводной сети; ОС реального времени является U-Микроядро распространяется со скоростью)
mane
1

голосов
1

ответ
59

Просмотры

Запуск процесса на конкретном процессоре в Linux? (Не может использовать командную строку, чтобы указать)

Я пытаюсь запустить процесс на определенном процессоре указываю в моей программе C периодически на моей машине Linux. Я не уверен, как указать в моей программе конкретного процессора процесс должен выполняться на. Я читал о том, чтобы сделать это в командной строке, но я не могу найти много о том, как сделать это внутри программы в самом C. Я знаю, что есть task_struct в каталоге включает / Linux / sched.h. При осмотре-структуры, я вижу несколько полей относительно процессора. Но я читаю (Чтобы получить доступ к печатной плате процесса в C), что доступ к информации задачи / процесса не рекомендуется или просто. Я также читал на «текущий» макро, но я не уверен, если это имеет отношение к моему вопросу. Моя программа очень проста и только в основном тест, показывающий, как я могу запустить задачу периодически на определенном процессоре.
Mr.Mips
1

голосов
1

ответ
595

Просмотры

Начиная писать ARM RTOS и путается отображение памяти

Так что я написал небольшой RTOS, прежде чем в школе, однако мы только с помощью карты памяти, загрузчик (RedBoot) оставил нам. Он (а TS-7200) имел 4x 8Mb сегментов барана, но загрузчик был «повторно отображается», чтобы они были смежными, начиная с 0. Я в основном интересно, что механизмы сделал это возможным, так как я теперь, глядя на написания легкий вес прошивка для px4fmu руки на основе автопилота, и хотела бы знать, что происходит с моей памятью, так что я могу понять, мой компоновщика сценарий, а также защиту памяти. Ли Загрузчик включить MMU и настроить таблица страниц таким образом, что адреса 0-32MB переводятся на правильные физические адреса? Если это так, я думал, что перевод не произойдет автоматически режим супервизора, который является то, что загрузчик оставляет тебя. Я подозревал это не так, и что загрузчик сделал некоторые GPMC колдовство, чтобы изменить то, как чипы памяти адресуются. Я читал кое-что о периферийных устройств, не являющихся повторно отображаемыми, что будет иметь смысл с этой теорией. Если это так, то кто-то может дать мне краткий обзор того, как это работает /, где какие адреса в конечном итоге это означает, что? Я видел вещи в руководствах пользователя SoC о «шины адреса» до того, как они соотносятся / переводят в адреса в различных типах памяти?
mthiffau
1

голосов
3

ответ
2.2k

Просмотры

Как использовать OSTmrCreate таймера для выполнения планирования задач с MicroC / OS II?

У меня 2 задачи в MicroC для имитации движущегося транспортного средства: ControlTask ​​и VehicleTask. Теперь мой проект должен заменить переключение контекста с таймером для более подходящего времени, но я не могу показаться, чтобы сделать это. Теперь программа использует оператор OSTimeDlyHMSM реализовать периоды, но вместо этого мягкие таймеры должны использоваться с семафорами. OSTmrCreate в C / ОС-II ReferenceManual (Глава 16). Я могу запустить таймер, то я могу поместить его в стартовом коде, но я не в состоянии вызвать таймер и синхронизацию должным образом между двумя задачами, заменяющих OSTimeDlyHMSM с таймером. Я думаю, что мое решение становится все более сложным, чем neccesary, потому что я не мог понять все детали, например, почему мне нужны семафоры и почему это более точно с таймером, чем встроено OSTimeDlyHMSM. Моя полная работа далеко выглядит следующим образом: #include #include системы». OS_STK ControlTask_Stack [TASK_STACKSIZE]; OS_STK VehicleTask_Stack [TASK_STACKSIZE]; // Приоритеты задач #define STARTTASK_PRIO 5 #define VEHICLETASK_PRIO 10 #define CONTROLTASK_PRIO 12 // задач Периоды #define CONTROL_PERIOD 300 #define VEHICLE_PERIOD 300 / * * Определение объектов ядра * / // Почтовые ящики OS_EVENT * Mbox_Throttle; OS_EVENT * Mbox_Velocity; // семафоры OS_EVENT * aSemaphore; // SWTimer OS_TMR * SWTimer; OS_TMR * SWTimer1; БУЛЕВ статус; / * * Типы * / перечисление активный {включение, выключение}; перечисление активного gas_pedal = выключено; перечисление активного brake_pedal = выключено; перечисление активного top_gear = выключено; перечисление активного двигателя = выключено; перечисление активного cruise_control = выключено; / * * Глобальные переменные задержки * / INT; // Задержка HW-таймер INT16U led_green = 0; // Зеленые светодиоды INT32U led_red = 0; // Красные светодиоды INT sharedMemory = 1; аннулированию ContextSwitch () {Е (» } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) 0) wind_factor = скорость * Скорость / 10000 + 1; остальное wind_factor = (-1) * скорость * Скорость / 10000 + 1; если (положение <4000) заторможенность = wind_factor; // даже землю иначе, если (положение <8000) заторможенность = wind_factor + 15; // путешествия в гору еще если (позиция <12000) заторможенность = wind_factor + 25; // путешествие крутой горы еще если (положение <16000) замедляющий = wind_factor; // даже землю иначе, если (положение <20000) заторможенность = wind_factor - 10; // спусках еще заторможенность = wind_factor - 5; // путешествие крутого спуска ускорение = * дроссель / 2 - заторможенность; положение = adjust_position (положение, скорость, ускорение, 300); скорость = adjust_velocity (скорость, ускорение, brake_pedal, 300); Е ( "Положение:% дм \ п", положение / 10); Е ( "Скорость:% 4.1fm / с \ п", скорость /10.0); Е ( "дроссельная заслонка:% д \ п", * дроссельная заслонка / 10); show_velocity_on_sevenseg ((INT8S) (скорость / 10)); }} / * * Задача «ControlTask» является основной задачей данного приложения. Он реагирует на датчики * и генерирует ответы. * / Недействительная ControlTask ​​(недействительный * PDATA) {INT8U ERR; INT8U дроссельной заслонки = 40; / * Значение в диапазоне от 0 до 80, который интерпретируется как между 0,0 В и 8.0V * / * сбщ недействительными; INT16S * current_velocity; Е ( "Control Task создан! \ п"); в то время как (1) {MSG = OSMboxPend (Mbox_Velocity, 0, & ERR); current_velocity = (INT16S *) MSG; ERR = OSMboxPost (Mbox_Throttle, (недействительными *) & дроссель); OSTimeDlyHMSM (0,0,0, CONTROL_PERIOD); }} / * * Задача «StartTask» создает все другие объекты задачи ядра и * удаляет себя после этого. * / Недействительная StartTask (недействительный * PDATA) {INT8U ERR; пустота * контекст; статический сигнал alt_alarm; / * Необходимо для таймера ISR функции * / / * размер базы для таймера SW: HW_TIMER_PERIOD мс * / Задержка = alt_ticks_per_second () * HW_TIMER_PERIOD / 1000; Е ( "задержка в клещи% d \ п", задержка); / * * Создать аппаратный таймер с периодом 'задержки' * / если (alt_alarm_start (& тревога, задержка, alarm_handler, контекст) <0) {Е ( "Нет системных часов доступны н!"); } / * * Создать и запустить программный таймер * / SWTimer = OSTmrCreate (0, CONTROL_PERIOD / (4 * OS_TMR_CFG_TICKS_PER_SEC), OS_TMR_OPT_PERIODIC, ContextSwitch, NULL, NULL, & ERR); если (ERR == OS_ERR_NONE) {/ * Таймер был создан, но не приступившим * / Е ( "SWTimer был создан, но не начал \ п"); } Состояние = OSTmrStart (SWTimer, & ERR); если (ERR == OS_ERR_NONE) {/ * Таймер был запущен * / Е ( "SWTimer был запущен! \ п"); } / * * Создание объектов ядра * / // Почтовые ящики Mbox_Throttle = OSMboxCreate ((недействительными *) 0); / * Пустой ящик - Дроссель * / Mbox_Velocity = OSMboxCreate ((недействительными *) 0); / * Пустой ящик - Velocity * / / * * Создание статистики задач * / OSStatInit (); / * * Создание задач в системе * / ERR = OSTaskCreateExt (ControlTask, // Указатель на задаче кода NULL, // указатель на аргумент, что // передается задачи и ControlTask_Stack [TASK_STACKSIZE-1], // Указатель на начало // стека задачи CONTROLTASK_PRIO, CONTROLTASK_PRIO, (недействительный *) & ControlTask_Stack [0], TASK_STACKSIZE, (недействительный *) 0, OS_TASK_OPT_STK_CHK); ERR = OSTaskCreateExt (VehicleTask, // Указатель на поручает код NULL, // указатель на аргумент, который // передается задачи и VehicleTask_Stack [TASK_STACKSIZE-1], // указатель на начало // из стека задачи VEHICLETASK_PRIO, VEHICLETASK_PRIO, (недействительными *) & VehicleTask_Stack [0], TASK_STACKSIZE, (недействительными *) 0, OS_TASK_OPT_STK_CHK); Е ( «Все задачи и ядра Объекты генерироваться! \ п»); / * Задача самоудаляется * / OSTaskDel (OS_PRIO_SELF); } / * * * Функция «главный» создает только одну задачу «StartTask» и начинает * ОС. Все остальные задачи запускаются из задачи «StartTask». * * / INT основной (аннулируются) {Е ( "Cruise Control \ п"); aSemaphore = OSSemCreate (1); // двоичный семафор (1 ключ) OSTaskCreateExt (StartTask, // Указатель на поручает код NULL, // Указатель на аргумент, что // передается задачи (недействительными *) & StartTask_Stack [TASK_STACKSIZE-1], // Указатель к началу // из задач стека STARTTASK_PRIO, STARTTASK_PRIO, (недействительными *) & StartTask_Stack [0], TASK_STACKSIZE, (пустот *) 0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSStart (); возвращать 0; } Запуск выше программы обратного вызова ContextSwitch выполняется, но это еще не решает проблему использования таймеров вместо встроенного выхода и как применять его с семафорами. Круиз Контроль задержки в клещи 100 SWTimer был создан, но не начали SWTimer началось! Все задачи и ядро ​​объекты генерируются! Задача Автомобиль создан! Задача управления создана! ContextSwitch! Позиция: 0м Скорость: 0.5м / с дроссельной заслонки: 4V ContextSwitch! Позиция: ая Скорость: 1.0m / s дроссельной заслонка: 4V Позиция: ая Скорость: 1,5 м / с дроссельной заслонка: 4V ContextSwitch! Позиция: 0м Скорость: 2.0м / с дроссельной заслонки: 4V ContextSwitch! Позиция: ая Скорость: 2,5 м / с дроссельной заслонка: 4V ContextSwitch! Позиция: 2m Скорость: 3.0м / с дроссельной заслонки: 4V ContextSwitch! Обновление 141001 15:57 CET 2 семафоров + 2 таймера, кажется, как хорошее улучшение. Я надеюсь, что это может быть проверено или протестирован ... #include #include "system.h" #include "includes.h" #include "altera_avalon_pio_regs.h" #include "SYS / alt_irq.h" #include «SYS / alt_alarm. час" #define DEBUG 1 #define HW_TIMER_PERIOD 100 / * 100мс * / / * Кнопка Узоры * / #define GAS_PEDAL_FLAG 0x08 #define BRAKE_PEDAL_FLAG 0x04 #define CRUISE_CONTROL_FLAG 0x02 / * Переключатель Узоры * / #define TOP_GEAR_FLAG 0x00000002 #define ENGINE_FLAG 0x00000001 / * LED Узоры * / #define LED_RED_0 0x00000001 // #define двигателя LED_RED_1 0x00000002 // Top Gear #define LED_GREEN_0 0x0001 // круиз-контроль активируется #define LED_GREEN_2 0x0002 // круиз-контроль Кнопка #define LED_GREEN_4 0x0010 // Brake Pedal #define LED_GREEN_6 0x0040 // педаль газа / * * Определение задач * / #define TASK_STACKSIZE 2048 OS_STK StartTask_Stack [TASK_STACKSIZE]; OS_STK ControlTask_Stack [TASK_STACKSIZE]; OS_STK VehicleTask_Stack [TASK_STACKSIZE]; // Приоритеты задач #define STARTTASK_PRIO 5 #define VEHICLETASK_PRIO 10 #define CONTROLTASK_PRIO 12 // задач Периоды #define CONTROL_PERIOD 300 #define VEHICLE_PERIOD 300 / * * Определение объектов ядра * / // Почтовые ящики OS_EVENT * Mbox_Throttle; OS_EVENT * Mbox_Velocity; // семафоры OS_EVENT * aSemaphore; OS_EVENT * aSemaphore2; // SWTimer OS_TMR * SWTimer; OS_TMR * SWTimer1; БУЛЕВ статус; / * * Типы * / перечисление активный {включение, выключение}; перечисление активного gas_pedal = выключено; перечисление активного brake_pedal = выключено; перечисление активного top_gear = выключено; перечисление активного двигателя = выключено; перечисление активного cruise_control = выключено; / * * Глобальные переменные задержки * / INT; // Задержка HW-таймер INT16U led_green = 0; // Зеленые светодиоды INT32U led_red = 0; // Красные светодиоды INT sharedMemory = 1; недействительный TimerCallback (PARAMS) {// Сообщения для семафора, чтобы сигнализировать, что пришло время для выполнения задачи. OSSemPost (aSemaphore); // отпускании ключ} недействительным ContextSwitch () {Е ( "ContextSwitch! \ П"); sharedMemory = sharedMemory * -1; } Int buttons_pressed (недействительными) {вернуться ~ IORD_ALTERA_AVALON_PIO_DATA (DE2_PIO_KEYS4_BASE); } Int switches_pressed (недействительными) {вернуть IORD_ALTERA_AVALON_PIO_DATA (DE2_PIO_TOGGLES18_BASE); } / * * ИСР для HW таймера * / alt_u32 alarm_handler (недействительными * контекст) {OSTmrSignal (); / * Сигналы с «галочкой» для задержки SW таймера * / возврата; } Недействительным выпуск () {Е ( "ключ расцепления! \ П"); // OSSemPost (aSemaphore); // отпускании ключа OSSemPost (aSemaphore2); // Отпускание Printf ключа ( "выпущенное ключ! \ П"); } Аннулируются Release2 () {Е ( "Release2! \ П"); OSSemPost (aSemaphore2); // Отпускание Printf ключа ( "Release2! \ П"); } Статические INT b2sLUT [] = {0x40, // 0 0x79, 0x24 // 1, // 2 0x30, 0x19 // 3, 4 // 0x12, 0x02 // 5, 6 // 0x78, 0x00 // 7, 8 // 0x18, // 9 0x3F, // -}; / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) // 1 0x24, 0x30 // 2, // 3 0x19, 0x12 // 4, 5 // 0x02, 0x78 // 6, 7 // 0x00, 0x18 // 8, 9 // 0x3F, // -}; / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) // 1 0x24, 0x30 // 2, // 3 0x19, 0x12 // 4, 5 // 0x02, 0x78 // 6, 7 // 0x00, 0x18 // 8, 9 // 0x3F, // -}; / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) // 4 0x12, 0x02 // 5, 6 // 0x78, 0x00 // 7, 8 // 0x18, // 9 0x3F, // -}; / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) // 4 0x12, 0x02 // 5, 6 // 0x78, 0x00 // 7, 8 // 0x18, // 9 0x3F, // -}; / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) / * * Новообращенный INT до семь формата отображение сегмента * / INT int2seven (интермедиат Inval) {вернуться b2sLUT [Inval]; } / * * Скорость выходного тока на семь segement отображения * / пустот show_velocity_on_sevenseg (INT8S скорость) {INT TMP = скорость; ИНТ вне; INT8U out_high = 0; INT8U out_low = 0; INT8U out_sign = 0; если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0) если (скорость <0) {out_sign = int2seven (10); TMP * = -1; } Еще {out_sign = int2seven (0); } Out_high = int2seven (TMP / 10); out_low = int2seven (TMP - (TMP / 10) * 10); из = int2seven (0)
Niklas Rosencrantz
1

голосов
2

ответ
549

Просмотры

FreeRTOS блокировки на нескольких событий / объектов

В примере решения UDP / IP стек, здесь есть предложенное решение для блокировки на одной очереди событий. Что бы перейти к решению для защиты данных, что указатель указывает, пока не было обработано задачей ждет очереди. Скажем, например, что очередь заполняется из ISR. ISR не должен писать * pvData, если она не была обработана соответствующей задачей. Но так как там может быть несколько источников событий очереди, вероятно, следует быть больше, чем один элемент. В случае, если структура будет сделана: ЬурейеЙ STRUCT IP_TASK_COMMANDS {eIPEvent_t eEventType; SemaphoreHandle_t data_read; недействительный * pvData; } XIPStackEvent_t; С семафором, принятым в ISR и заданном в задаче, которая обрабатывает данные, когда это делается с ним.
evading
0

голосов
0

ответ
3

Просмотры

Could not read the Interrupt Priority after vTaskStartScheduler()

Я хочу использовать функцию NVIC_GetPriority (DMA1_Channel4_IRQn) с Freertos. Я могу использовать эту функцию перед vTaskStartScheduler (); но, когда я вызываю функцию NVIC_GetPriority (DMA1_Channel4_IRQn) после vTaskStartScheduler () ;, это не работает у вас есть какие-либо предложения? #include #include #include / * - * / статический недействительным vTest_NVIC (недействительными * pvParameters) {tprintf ( "\ г \ nTask Started ..."); / * - * / в то время как (1) {/ * - * / taskENTER_CRITICAL (); tprintf ( "\ г \ npriority =% d", NVIC_GetPriority (DMA1_Channel4_IRQn)); taskEXIT_CRITICAL (); vTaskDelay (3000) ;; }} Int основных () {portBASE_TYPE xReturn; / * - * / xReturn = xTaskCreate (vTest_NVIC (Const подписал portCHAR * сопзЬ) "Test_NVIC", configMINIMAL_STACK_SIZE
erenbasturk
2

голосов
1

ответ
871

Просмотры

чтение / запись файлов с карты памяти USB в УНЦ-OS / II

У меня есть доска с ARM процессором и Micrium RTOS на нем. Мне нужно для чтения / записи файлов с карты памяти USB. Например, стандартная функция, которая переименовывает файл находится рядом - INT FS_Rename (Const символ * sExistingName, Const символ * sNewName); какой путь я должен написать в sExistingName, чтобы указать файл на моей памяти USB?
drfred
2

голосов
1

ответ
26

Просмотры

Какой тип ядра ли использовать RTOS ЭКОС?

Из моих исследований я не могу найти то, что тип ядра используется в ЭКОС, таких как монолитные или микроядра. Все, что я смог найти из моего исследования является то, что ядро ​​реального времени один или веб-сайты просто описывают его как ядро ​​ЭКОС, это значит, что это заказ ядро? Что я знаю о Экос, что это тяжелая RTOS, хотя несколько восприимчивы с точки зрения безопасности, использует приоритет, Que на основе планирования.
Jordan
2

голосов
5

ответ
775

Просмотры

MPSOC: Какой ОС вы используете и почему?

Я работаю на MPSOC, специально STM ST40 (SH4 базы) и ST231, и мне интересно, какая ОС я могу использовать на них в порт параллельного приложения, я уже имел взгляд на STLinux, которая является распределением STM платформы Linux для их MPSOC (который, к сожалению, не работает хорошо для ST231 сопроцессоры), и я также имел взглянуть на OS21, которая является ОС на основе задач. Любая информация о других ОСРВ Добро пожаловать! (Особенно те, с LIBC и Pthreads :)
claf
6

голосов
2

ответ
2.1k

Просмотры

Что делает ядро ​​/ ОС реального времени?

Я читал эту статью, но мой вопрос на общем уровне, я имел в виду по следующим направлениям: Может ли ядро ​​назвать в реальном масштабе времени только потому, что он имеет реальный планировщик времени? Или, другими словами, что у меня есть ядро ​​Linux, и если я изменю планировщиком по умолчанию из O (1) или CFS в реальном времени планировщик, будет ли он стать RTOS? Требует ли она какой-либо поддержки со стороны оборудования? Вообще-то я видел встроенные устройства, имеющие RTOS (например, VxWorks, QNX), делают они имеют какие-либо специальные положения / HW для их поддержки? Я знаю, что время работы ОСРВ процесса является детерминированным, но можно использовать LongJump / setjump, чтобы получить выход в определенное время. Я бы очень признателен ввода / представление о нем, если я неправ о чем-то, пожалуйста, поправьте меня.
brokenfoot
2

голосов
4

ответ
511

Просмотры

Процессор может поддерживать / требует RTOS?

У меня есть несколько запросов, связанных с выходом в течение RTOS для различных процессоров в руке. Эти общие вопросы. Может быть, вы можете уточнить примеры, характерные для любых процессоров / RTOS или даже вообще. Как определить, является ли процессор может поддерживать ОС реального времени? Как знать, если процессор требует RTOS?
6

голосов
4

ответ
1.1k

Просмотры

Alternatives to explicit stacks in RTOS-removal excercise?

В встроенных приложениях запрограммированные на C на ARM7 (с переносимостью требований), в настоящее время с использованием коммерческих приоритетов на основе упреждающей RTOS, нам нужно удалить, что RTOS и любой RTOS зависимость в мандате клиента. У нас есть 8 задач с использованием многих интерфейсов HW, выписок сна, I2C связи. Как он, SW делает хорошее использование функций RTOS для упрощения кода, хотя требования к синхронизации будет управляемым без ОС реального времени. Некоторые функции, в том числе подпрограмм, называемых во многих местах, в настоящее время реализовать последовательности блокировки (для этого потока) вызовов функций I2C водителя, выписки сна и т.д. Основываясь на предположении, что на избирательный I2C вызовов / режим сна не является приемлемой для клиентов, такие вызовы должны тогда без блокировки и возврата. Вопрос, конечно, чтобы «вернуться» в «заявление», возможно, 4 вызова вниз от входа задачи верхнего уровня, когда I2C завершается или время сна прошло. Я сходящийся в направлении иерархическом состояния машины для каждой задачи, с помощью простого планировщика на вершине. Но обработка несколько подпрограмм, которые используются, чтобы сделать последовательности тогда блокирующими вызовов и теперь стал каждым конечным автоматом, который может вызываться в нескольких местах и ​​на разных глубинах вызова функции, как представляется, требует явной функции стеки для каждой задачи, так что каждый раз, когда я начинаю субгосударственную-машину, я могу выделить состояния для этого процесса и толкать их на «государственный пачке» эта задачу, так что следующий планировщик вызовы для выполнения этой задачи будут в состоянии пойти вниз все иерархические состояния для продолжения обработки, где она «кончили». Вы можете увидеть другие проектные архитектуры применимы к данному вопросу, соображения для быстрого портирования коды на невытесняющую парадигму, или точку к мысли обогащающих ресурсам и дискуссии о методах и конструкциях «RTOS-удалении»? Три ответы все вместе рисуют хорошую картину состояния машины на основе уместности развития и связанные с ними инструменты, чтобы избежать повторного изобретения колеса. Наши клиенты не будут принимать какие-либо лицензии, в том числе GPL. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. или пункт продуманного обогащения ресурсов и обсуждение методов и конструкции «RTOS-удаление»? Три ответы все вместе рисуют хорошую картину состояния машины на основе уместности развития и связанные с ними инструменты, чтобы избежать повторного изобретения колеса. Наши клиенты не будут принимать какие-либо лицензии, в том числе GPL. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. или пункт продуманного обогащения ресурсов и обсуждение методов и конструкции «RTOS-удаление»? Три ответы все вместе рисуют хорошую картину состояния машины на основе уместности развития и связанные с ними инструменты, чтобы избежать повторного изобретения колеса. Наши клиенты не будут принимать какие-либо лицензии, в том числе GPL. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. техники и конструкций? Три ответы все вместе рисуют хорошую картину состояния машины на основе уместности развития и связанные с ними инструменты, чтобы избежать повторного изобретения колеса. Наши клиенты не будут принимать какие-либо лицензии, в том числе GPL. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. техники и конструкций? Три ответы все вместе рисуют хорошую картину состояния машины на основе уместности развития и связанные с ними инструменты, чтобы избежать повторного изобретения колеса. Наши клиенты не будут принимать какие-либо лицензии, в том числе GPL. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо. Из ответов, кажется, что нет никакого пути вокруг кэширования состояния, если один хочет использовать иерархические автоматы без ОС реального времени и с избирательными вызовами запрещены. Как иерархическая SM помогает много портированию существующего кода, сохраняя свою структуру (вызовы функций подпрограммы становится вызовом субгосударственных машин), я буду идти по этому пути, используя предоставленные инструменты в качестве хороших примеров. - Спасибо.
EmbeddedMike
4

голосов
1

ответ
1.7k

Просмотры

Модульное тестирование проекта, который использует ОС реального времени

Для моего следующего проекта встроенных систем я хочу, чтобы охватить модульное тестирование. Это не может быть технически разработка через тестирование, но я бы, по крайней мере, как для модульных тестов приборных спереди и имеют комплексное опробование блока. Я использую цепь инструмента IAR EWARM. Я рассматриваю, используя cmocka, единство или Куните. Я учусь к использованию микроСи / ОС-III как ОСРВ. Вот вопрос: Как модульного тестирования будет работать с ОС реального времени в картине? EG: Должен ли я отключить ядро ​​и блок проверки кода в виде одного многопоточного приложения и заглушки все / большинство вызовов ядра, или есть способ лучше? Пример: В мкКл / OS-III точка входа по-прежнему главной. От основных вы звоните любой код инициализации, а затем сделать вызов OSStart (), чтобы начать многозадачность. Поэтому, когда я бегу тест Жгут я мог бы просто не сделать вызов OSStart () #ifdef UNIT_TEST test_runner (); #else OSStart (& ERR); #endif Тогда всего моего кода приложения в задачах мне просто нужно будет издеваться передачи сообщений и задержки вызовов ядра. Это самый лучший способ сделать это. Или я был бы лучше подхожу, начиная ядро, создавая задачи для моего тестового бегуна, и выполнение всех задач из тех, которые, как один потока, или есть какой-то другой хороший подход, включающий порождая другие задачи из тестового жгута проводов.
Nick
2

голосов
3

ответ
1.6k

Просмотры

Как программировать в Windows 7.0, чтобы сделать его более детерминированным?

Я понимаю, что для Windows не является детерминированным и может быть проблемы при его использовании для сбора данных. Используя 32-битную шину, и двухъядерный, можно использовать встроенный ассемблер для работы с прерываниями в Visual Studio 2005 или, по крайней мере, установить какие-то флаги, чтобы быть последовательным во времени с небольшим джиттера? Идя направление ОСРВ (операционная система реального времени): Windows CE с программированием в режиме ядра может стать слишком дорогим для нас.
jdl
2

голосов
3

ответ
2.3k

Просмотры

Контекст реле времени - Роль RTOS и процессора

Играет ли RTOS главную роль или процессор играет важную роль в определении времени для переключения контекста? Каков процент доли между этими двумя основными игроками в определении времени переключения контекста. Может кто-нибудь сказать относительно УНЦ / OS-II RTOS?
1

голосов
2

ответ
401

Просмотры

Канонический способ (ы) определения системного времени в микроконтроллере

Каждый так часто я начинаю голый проект металла микроконтроллера и в конечном итоге реализации измерения времени системы с помощью блока случайного таймера. Я работаю с устройствами ARM Cortex-M для (хотя и короткий), а в настоящее время и, как правило, используется SysTick ( «System Tick») прерывают создать таймер разрешения 1мс. Недавно наткнулся на пост, который предложил цепочки два программируемых прерываний таймеров (на устройстве Kinetis KL25Z) для того, чтобы создать таймер 32bit миллисекунды прерывания меньше, однако жертвуя два PIT прерывания, которые могут пригодиться в дальнейшем. Так что мне было интересно, если есть некоторые (вроде) канонические способов определения системного времени на микроконтроллере - предпочтительны для устройств Kinetis KL2xZ, как я работаю с ними, но не обязательно.
sunside
11

голосов
5

ответ
9.6k

Просмотры

Как использовать сторожевой таймер в ОСРВ?

Предположим, у меня есть совместный планировщик в вложенной среде. У меня есть много процессов. Я хочу использовать сторожевой таймер, так что я могу определить, когда процесс перестал вести себя по какой-либо причине и сброса процессора. В более простых приложениях, не имеющие ОС реального времени я всегда потрогать сторожевой из основного цикла, и это всегда было адекватным. Однако, здесь есть много процессов, которые потенциально могут зависать. Что такое чистый способ прикоснуться к сторожевой таймер периодически, обеспечивая при этом, что каждый процесс находится в добром здравии? Я думал, что я мог бы обеспечить функцию обратного вызова для каждого процесса, с тем чтобы он мог позволить еще одну функцию, которая отвечает за все, знаю, что все еще жив. Обратный вызов будет передавать параметр, который был бы задачи уникальный идентификатор, так надзиратель мог определить, кто звонит обратно.
user946230

Просмотр дополнительных вопросов