En el diseño integrado, ¿cómo elegir el marco de desarrollo de software subyacente?

Transferencia desde | Habayashi-kun

Al escribir el código subyacente, el diseño del marco inicial siempre enfrentará opciones. Para el entorno de uso de hardware real, tiene muchas opciones para el marco de software que utiliza. Hoy describo brevemente algunas de las arquitecturas más comúnmente utilizadas para que pueda comprender y elegir la correcta. Arquitectura.

Visión de conjunto

1. Ejecución secuencial simple del programa : Este tipo de escritura es el método utilizado por la mayoría de las personas, no necesitas pensar en la estructura específica del programa, simplemente escribe la aplicación directamente en el orden de ejecución.

2. Programa de ejecución de front-end y back-end: agregue un mecanismo de procesamiento de interrupciones de front-end en el caso de ejecución secuencial, configure un programa de bucle de back-end a gran escala ejecutado en secuencia y combínelos en un programa que pueda responder en tiempo real.

3. Método de operación por turnos de segmentos de tiempo: en la arquitectura de ejecución de front-end y back-end, el programa se planifica con más detalle a través de contadores y segmentos específicos se ejecutan regularmente.

4.  Sistema operativo en tiempo real: El sistema operativo en tiempo real también se denomina RTOS, en tiempo real. El kernel de RTOS es responsable de administrar todas las tareas. El kernel determina qué tarea ejecutar y cuándo detener la tarea actual y cambiar a otras tareas. Esta es la capacidad de administración multitarea del kernel. . La administración multitarea se siente como si el chip tuviera varias CPU. La administración multitarea maximiza el uso de los recursos de la CPU. La administración multitarea ayuda a realizar el desarrollo modular de programas y realizar aplicaciones complejas en tiempo real.

Además del rendimiento en tiempo real, también hay un kernel privado. Como su nombre lo indica, puede privar a otras tareas de los derechos de uso de la CPU. Siempre ejecuta la tarea con la mayor prioridad entre las tareas listas.

1. Programa de ejecución de secuencia simple

    Este tipo de aplicación es relativamente simple, generalmente se usa como un simple elemental, en tiempo real y no demasiado exigente, se puede usar. El diseño del programa es relativamente simple y el pensamiento es relativamente claro. Pero cuando la lógica del ciclo principal es más complicada, es difícil para otros entender la lógica del programa sin un diagrama de flujo completo.

Escriba un modelo de programa para ejecución secuencial a continuación

int main(void) 
{
    uint8 TaskValue;     
    InitSys();                  // 初始化    
    while (1)     
    {
      TaskValue= GetTaskValue();         
      switch (TaskValue)        
      {             
        case x: 
          TaskDispStatus(); 
        break;             
        ...             
        default:
        break;         
      }     
   } 
}

2. Ejecute el programa antes y después

    La característica de este programa es que el programa predeterminado siempre se ejecuta en el bucle grande de fondo, el programa de servicio de interrupción (ISR) genera la marca de interrupción correspondiente y el programa principal ejecuta el programa de tareas asociado con la marca de interrupción. La implementación general tiene las siguientes ideas:

    Al configurar la variable de bandera y luego configurar o restablecer la variable de bandera cuando el primer plano responde a la interrupción, se realiza la adquisición de la señal del evento, y luego la transacción o los datos correspondientes a la interrupción se procesan en el bucle principal de fondo, y el flujo del programa se transfiere al programa principal .

Programas de front-end y back-end

void IRQHandler(void)
{
  if(GetITStatus == 1)
  {
    SysFlag = 1;
    GetITStatus = 0;
  }
}
int main(void) 
{
    uint8 TaskValue;     
    InitSys();                  // 初始化    
    while (1)     
    {
      TaskValue= GetTaskValue();         
      switch (TaskValue)        
      {             
        case x: 
          if(SysFlag == 1)
          {
            TaskDispStatus(); 
            SysFlag == 0;
           }
        break;             
        ...             
        default:
        break;         
      }     
   } 
}

3. Arquitectura por turnos de intervalo de tiempo

Método round robin de intervalo de tiempo, cuando lo ve, generalmente lo compara con el sistema operativo. No es que el sistema operativo incluya este método, pero los programas de front-end y back-end cooperan con la administración del tiempo para formar una arquitectura de operación por turnos de intervalos de tiempo.

Esta arquitectura ha sido lo más cercana posible a RTOS, administración de tiempo, administración de interrupciones y administración de tareas. Es solo que RTOS hará modificaciones más profundas en el kernel. Hay conmutación de subprocesos para retraso de retardo y conmutación de tareas preventiva. Para funciones más complicadas, etc.

Rebanada de tiempo por turnos

La administración de los segmentos de tiempo se realiza principalmente mediante la multiplexación de la sincronización, el conteo en el temporizador y el cambio de la bandera en la sincronización, y luego el programa principal juzga la verdad o la falsedad de la bandera para realizar la ejecución de diferentes estados de tareas en diferentes momentos.

Debido a que este código de arquitectura es mejor, lo describiré en detalle.

paso

1: Inicialice el temporizador correspondiente: preste atención a la configuración de la frecuencia de intervalo del temporizador, que se puede configurar de acuerdo con el rendimiento del chip. Por ejemplo, establezca la interrupción de tiempo en 1 ms, o se puede establecer en 10 ms. La parte del temporizador en la arquitectura de operación por turnos tiene la misma función que la parte del temporizador del sistema operativo. La interrupción es demasiado frecuente y afecta la eficiencia de la ejecución del programa principal; el intervalo de interrupción es demasiado largo , La respuesta en tiempo real es deficiente.

2: Establezca un indicador de estructura de función para la tarea ejecutada por el temporizador para el recuento de tiempo y el funcionamiento del indicador en el programa de temporización.

#define TaskTAB_NUM  6 //任务数量
__packed typedef struct{
  u8 flag;  //定时标志
  u32 numcount;//按照定时中断进行计数
  u32 target;  //设置的定时目标数值
  int(*fun)(void);//设置定时执行的目标任务函数
}TaskTimTypeDef

paso

    3: Establezca una tabla de tareas y determine el cronograma de ejecución de la tarea configurando la tabla de estructura.

Al definir las variables, hemos inicializado los valores, la inicialización de estos valores es muy importante y tiene algo que ver con la prioridad del tiempo de ejecución específico, esto debe ser dominado por usted mismo.

/*MdmSendTimTab任务函数默认周期,单位5ms,TIM7*/
static TaskTimTypeDef TaskTimTab[TaskTAB_NUM] =
{
  {1, 0, 30000,      *Task00},          //Task00 3000数值是设置的定时目标值,如果觉得反应过慢,可以将此值设置小
  {1, 0, 3000,       *Task01},          //Task01
  {1, 0, 300,        *Task02},          //Task02
  {1, 0, 30,         *Task03},          //Task03
  {1, 0, 3,          *Task04},          //Task04
  {1, 0, 0xFFFFFFFF, *Task05},          //Task05  
  //可以按照TaskTAB_NUM数量添加任务
};
int Task00(void)//按照结构体的函数模板(int(*fun)(void);)写任务函数
{...}//假设执行按键操作
int Task01(void)
{...}//假设执行USART发送任务
int Task02(void)
{...}//假设执行CAN通讯
int Task03(void)
{...}//假设执行继电器控制
int Task04(void)
{...}//假设执行网络解析
int Task06(void)
{...}//假设执行空

paso

    4: Función de servicio de interrupción de sincronización, sincronización de acuerdo con el tiempo que necesitamos y operación de bandera.

 //定时中断服务函数
 void TimerInterrupt(void)
 {
    for(char i=0; i<TaskTAB_NUM; i++)
    {
      if(TaskTimTab[i].flag == 1)
      {
        (TaskTimTab[i].numcount< TaskTimTab[i].target)//比较目前定时计数与目标时间
        (TaskTimTab[i].numcount++):(TaskTimTab[i].flag = 0);
      }
    }
  }

paso

    5: La función principal realiza la ejecución de la función de tarea.

int main(void) 
{      
  InitSys();                  // 初始化     
  while (1)     
  {
      for(char i=0; i<TaskTAB_NUM; i++) 任务处理    
      {
        if(TaskTimTab[i].flag == 0)
        {
          if(TaskTimTab.flag == 0)
          {
            TaskTimTab[i].flag  = 1;
            TaskTimTab[i].numcount= 0;
            TaskTimTab[i].fun();
          }
      }
  } 
} 

4. Sistema operativo RTOS

    El sistema operativo integrado es un marco de ejecución más optimizado, que se utiliza muy bien para tareas múltiples, funciones complejas y fuertes requisitos de escalabilidad. RTOS es un kernel multitarea en tiempo real de alta eficiencia optimizado para diferentes procesadores. RTOS puede proporcionar interfaces API similares para docenas de series de procesadores integrados MPU, MCU, DSP, SOC, etc. Esto se basa en la independencia del dispositivo. Fundación del desarrollo de aplicaciones. Por tanto, el programa en lenguaje C basado en RTOS tiene una gran portabilidad. En la actualidad, los sistemas operativos para microcomputadoras microintegradas o de un solo chip incluyen VxWorks , UCOS, Free RTOS y RTT de producción nacional. Estos sistemas operativos son similares y tienen funciones básicas similares: administración de tareas, sincronización y comunicación entre tareas, administración de memoria, servicio de reloj en tiempo real, interrupción Servicios de gestión .

(Blog de fuente de imagen)

RTOS continúa agregando suspensión y reanudación de tareas, bloqueo y conmutación de subprocesos, etc. en la arquitectura de operación por turnos, que es una acumulación de funciones y una mayor optimización. Dado que esta no es una introducción a RTOS, he aprendido y aplicado varios sistemas operativos como UCOS, RTT y Free RTOS. Debido al espacio y tiempo limitados, me tomaré el tiempo para presentar la arquitectura detallada del sistema RTOS .

Hay muchos sistemas RTOS en la actualidad, y muchos proyectos tienden a utilizar RTOS, pero a través del análisis de varias arquitecturas, se entiende que diferentes proyectos requieren arquitecturas diferentes. No todos los proyectos los necesitan, y todos son aptos para usar RTOS, como el acoplamiento de varias tareas en el proyecto. Si es demasiado grande, si usa RTOS, necesita mucha sincronización de tareas y ni siquiera puede planificar los hilos. Esto pierde completamente el significado de RTOS. En este momento, es más apropiado usar alguna arquitectura bare metal.


1. Mesa redonda virtual Parte 1: Seguridad de la información del sistema integrado

2. ¿ El secreto del 5G de Huawei estaba originalmente en manos de un turco? !

3. Se publican las últimas clasificaciones de semiconductores y Nvidia logra un crecimiento del 50%.

4. [MCU] Un programa de actualización de IAP "flexible y que ahorra recursos"

5. ¿Por qué RISC-V se está convirtiendo en un punto caliente?

6. Introducción al sistema operativo Hongmeng adecuado para desarrolladores ~

Descargo de responsabilidad: este artículo se reproduce en línea y los derechos de autor pertenecen al autor original. Si está involucrado en los problemas de derechos de autor de la obra, comuníquese con nosotros, confirmaremos los derechos de autor según los materiales de certificación de derechos de autor que proporcione y pagaremos la remuneración del autor o eliminaremos el contenido.

Supongo que te gusta

Origin blog.csdn.net/DP29syM41zyGndVF/article/details/110412124
Recomendado
Clasificación