Preguntas con etiqueta 'freertos'

2
respuestas

FreeRTOS para el conmutador SAM Cortex-M3 de Atmel entre tareas

Estoy jugando con FreeRTOS en un mcu Cortex-M3 de Atmels y me preguntaba cómo puedo pasar de una tarea actual a otra independientemente de su prioridad. Para ser exactos: envío datos a uno de los puertos USART de mcu. He habilitado la interrupci...
2
respuestas

Método para tener largos retrasos de tareas en freertos

Me preguntaba cómo puedo demorar más tiempo usando la función vTaskDelay () de freertos. Debido a que el número más grande que puede almacenar en un entero sin signo de 16 bits es 65535, el más largo que puedo demorar es un poco menos de 2 horas...
1
respuesta

Conmutador de contexto FreeRTOS ARM Cortex-M4

Estoy examinando el procedimiento de cambio de contexto en un procesador basado en ARM Cortex-M4 que ejecuta FreeRTOS. En port.c tenemos: void xPortPendSVHandler( void ) { /* This is a naked function. */ __asm volatile ( " m...
1
respuesta

Eventos en FreeRTOS 7.1.1

Estoy buscando un método para informar una tarea en el firmware sobre el cambio en otro lugar (utilizando FreeRTOS 7.1.1). Necesito recibir información acerca de los cambios, pero no querría verificar el valor en el ciclo, algo así como interrup...
2
respuestas

FreeRTOS - Problemas potenciales con tareas periódicas

Supongamos que la tarea 1 tiene la prioridad más alta de todas las tareas, y se ejecuta periódicamente usando vTaskDelayUntil (). La tarea 2 tiene una prioridad más baja, pero también se requiere que se ejecute periódicamente en intervalos de...
1
respuesta

RTOS y OS trabajando juntos en un trabajo cooperativo

Me gustaría usar un RTOS y un sistema operativo lado a lado para implementar un trabajo cooperativo. El RTOS realizaría una tarea crítica en tiempo real (tiempo real) y el sistema operativo realizará otras funcionalidades no críticas, como la...
1
respuesta

Compatibilidad ARM entre proveedores, con y sin RTOS (FreeRTOS) [duplicado]

Me gustaría saber cuánta compatibilidad puedo esperar entre ARM MCU de diferentes proveedores. Por ejemplo, digamos que escribo un firmware en lenguaje C para un Cortex M0 con su periférico CAN. ¿Podré trasladarlo a un Cortex M0 de un prove...
1
respuesta

Controlador PID de FreeRTOS (stm32duino) [cerrado]

Actualmente estoy trabajando con un sistema integrado implementado en el microcontrolador Blue Pill SMT32F103C8T6 basado en FreeRTOS. Quiero controlar la velocidad y la posición del motor de CC con el controlador PID. Para el control de posición...
1
respuesta

STM32 - Medición de temperatura basada en ADC en FreeRTOS

He estado tratando de medir la temperatura de la MCU (STM32F103RB) como parte de una aplicación FreeRTOS. He intentado inicializar el ADC con las funciones HAL de bajo y alto nivel, pero cada vez que trato de obtener datos, la variable que los a...
3
respuestas

___ método qstnhdr ___ para manejar fuentes de interrupción GPIO concurrentes? ______ qstntxt ___

Tengo dos fuentes de interrupción GPIO que se ejecutan en dos subprocesos separados:

  1. Pulsos GPIO siguiendo la línea de frecuencia (60 Hz)
  2. botón
  3. presionar

¿Cómo puedo usar estas dos interrupciones simultáneamente, considerando que mi controlador (ESP32) multiplexa todas las interrupciones del periférico GPI0 en una interrupción de la CPU?

Actualmente, el programa permite que solo uno de ellos funcione a la vez.

Gracias

    
______ answer370267 ___

Estoy escribiendo esto sin utilizar nunca un ESP32 (o cualquier otro núcleo dual) o FreeRTOS. Desde mi conocimiento de FreeRTOS (búsqueda muy rápida), implementas los controladores de interrupción por tu cuenta, pero tienes que llamar a algunas funciones del sistema operativo desde dentro.

Por lo tanto, independientemente de la GPIO en la que ocurra la interrupción, terminará en la misma función de interrupción, porque solo hay un vector de interrupción para GPIO.

Pero el ESP32 tiene algunos registros para decirle qué interrupciones están pendientes. Y tienes registros que te dicen qué interrupción está habilitada. La combinación de esos registros le permite decidir qué pines están causando una interrupción.

Por lo tanto, en función de esto, puede hacer diferentes cosas según el GPIO que haya provocado la interrupción.

Te voy a dar una idea, no una implementación, así que lo siguiente es pseudocódigo:

%pre%

De esta manera puede dividir la interrupción en múltiples funciones de ejecución. Prefiero la manera de usar las funciones, pero estoy programando en C ++ e intento evitar las variables globales.

    
______ answer370257 ___

Primero verifique si el firmware / SDK le permite dividir las interrupciones. Es posible que tengas que saltar algunos aros adicionales para poder hacerlo. Muchas veces, el SDK basado en arduino silenciará las opciones disponibles para que sea más fácil para los principiantes y unificar la experiencia en diferentes tableros. Y revise la especificación del microcontrolador para ver exactamente qué sucederá cuando entren las interrupciones mientras ya está manejando otra.

De lo contrario, puede comprobar qué provocó la interrupción dentro de la rutina de interrupción y luego establecer un indicador volátil para manejarlo en su bucle principal.

    
______ answer370293 ___

A menos que un dispositivo tenga un enganche por pin de eventos de interrupción, su mejor opción es probablemente rastrear el último estado reconocido de cada registro de puertos de E / S [en %code% , abajo], y luego hacer algo como:

%pre%

Si cualquier bit de interés se establece en %code% o %code% , el código debe borrar atómicamente el bit (tal vez al deshabilitar las interrupciones, usar la carga vinculada / almacenamiento condicional u otros medios) y manejar la condición apropiada. Tenga en cuenta que si el estado de un pin cambia y luego vuelve a cambiar antes de ser observado por el código anterior, la transición debería perderse.

Cada vez que el sistema vaya a estar inactivo en función de una interrupción de cambio de pin, debería borrar el indicador de interrupción de cambio de pin, luego verificar si el estado del puerto coincide con %code% , y solo irse a dormir si lo hace partido. De esa manera, si el pin del puerto cambia antes de leerlo, el código lo notará y, si cambia después de leerlo, el hardware lo notará. Algunas plataformas hacen que sea imposible evitar por completo las condiciones de carrera, pero las buenas plataformas garantizarán que los eventos que se producen entre el borrado de la bandera y la lectura del estado del puerto se activen por el hardware además de que se informen en el software. En consecuencia, incluso si un evento que ocurre precisamente cuando el puerto se está leyendo no aparece en la lectura, aún se registrará como una activación de hardware.

    
___

Tengo dos fuentes de interrupción GPIO que se ejecutan en dos subprocesos separados: Pulsos GPIO siguiendo la línea de frecuencia (60 Hz) botón presionar ¿Cómo puedo usar estas dos interrupciones simultáneamente, considerando que mi con...