C incrustado para automóvil autónomo, parte 1

May 10 2022
Tipo entero Entonces está listo para escribir código incrustado para un automóvil autónomo como WAYMO o un termostato inteligente como Nest. Desea escribir un código que irá a un procesador específico para analizar ciertos datos del sensor para tomar decisiones como girar a la derecha o encender la calefacción.

Tipo entero

Foto de David von Diemar en Unsplash

Entonces, está listo para escribir código incrustado para un automóvil autónomo como WAYMO o un termostato inteligente como Nest. Desea escribir un código que irá a un procesador específico para analizar ciertos datos del sensor para tomar decisiones como girar a la derecha o encender la calefacción.

Sentémonos y pensemos un poco profundo. Analicemos el problema. Centrémonos sólo en una parte particular del problema.

Como ejemplo, solo voy a hablar de un único problema que procesará la ubicación actual del vehículo autónomo que en la jerga técnica se llama LOCALIZACIÓN. Que en mi experiencia es el problema más difícil técnicamente.

En el problema de localización, hay múltiples datos de sensores que ayudan a tomar una decisión sobre la ubicación actual, la dirección a la que se dirige y la postura (JUMPING como un TRX). Nos centraremos en pensar que el vehículo va a avanzar y solo necesitamos saber cuánto avanzó.

Foto de Jorgen Hendriksen en Unsplash

Simplifiquemos más el problema. Asumiremos que no habrá ningún deslizamiento del neumático como la forma en que conducen los calvos en RÁPIDO Y FURIOSO. Y también supongamos que la llanta es perfectamente redonda y cada rotación de la llanta convertida en circunferencia puede brindarle con confianza la distancia que avanzamos.

Dado que conocemos el tamaño de la llanta, solo necesitamos saber cuántas veces giró la llanta. Para eso, tenemos un sensor llamado codificador, que realiza un seguimiento de la rotación de la rueda.

Foto de Bechir Kaddech en Unsplash

Puede pensar en un codificador como la rueda de la bicicleta. En la imagen, muestra el radio de la rueda. Puede ver en la imagen que hay alrededor de 48 radios para la rueda.

Ahora bien, si me convierto en una persona diminuta incrustada en la HORQUILLA delantera de la bicicleta y tengo una visión unidireccional como un ojo atado a una cabra, solo puedo ver un radio a la vez.

Si quiero determinar cuántas veces giró la rueda por minuto, me quedaré allí con un cronómetro y contaré la cantidad de veces que veo hablar. Supongamos que conté 960 hablas en un minuto. Eso significa que mi rueda giró 20 veces.

Supongamos que la circunferencia de mi rueda es de 2200 mm. Eso significa que mi bicicleta recorrió 2200*20 = 44000 mm o 44 m. Así es exactamente como funciona un codificador/resolvedor de posición angular en un vehículo.

Pero en la vida real, no hay un Yo sentado en la horquilla o en el eje del vehículo contando el número. Un controlador integrado hará eso por nosotros.

Ahora pensemos cuáles son las consideraciones de diseño importantes para esto. En mi controlador integrado, me gustaría almacenar estos datos. Ahora, ¿cómo debo definirlo?

Por lo tanto, siempre debemos elegir el tipo de datos para nuestras variables de interés utilizando las siguientes matrices de rendimiento clave para aplicaciones integradas

  1. Memoria:

2. Almacenamiento:

Es posible que necesitemos usar la variable que estamos declarando en un programa más pequeño para hacer algo. Entonces, si usamos una variable grande, el tamaño del programa/ejecutable será más grande y consumirá almacenamiento.

3. Poder de procesamiento:

Misma lógica que antes. Si define el tipo de variable más grande, el procesador tardará más en procesar cualquier cosa relacionada con la variable. Entonces, de nuevo, cuanto más pequeño pueda caber, mejor.

4. Hardware específico:

En algún momento, el hardware que está utilizando puede tener restricciones en el tipo de datos. Tienes que comprobar eso. El mapa de memoria que se usa en el registro para ese conjunto de hardware en particular puede ser una restricción al elegir el tipo de datos para su variable.

Ahora veamos la declaración anterior para una arquitectura en particular. Si tomamos una arquitectura de conjunto de instrucciones (ISA) de 32 bits para nuestros datos de codificador, debemos centrarnos en el tipo de número entero que puede admitir.

Esta arquitectura puede admitir int corto/corto que tiene un tamaño típico de 16 bits cuyo rango es de 0 a 65 535 para los no firmados y de -32 768 a 32 767 para los firmados.

Esta arquitectura también puede admitir el tipo de datos int , que puede llegar hasta los 32 bits. Eso hace que el rango sea de 0 a 4,294,967,296 para los sin firmar o de -2.147e9 a +2.147e9 para los que tienen signo.

Foto de Science en HD en Unsplash

Supongamos que el codificador que estamos usando para la detección de la velocidad de la rueda contiene exactamente lo mismo que los radios de la rueda de la bicicleta. Así que necesitamos contar hasta 48. Pero, ¿quieres usar int o short directamente para nuestra detección de velocidad de la rueda? Incluso si usamos short int , termino usando mucha más memoria de la que necesito usar. Además, si planeo realizar algún procesamiento con estos datos (por ejemplo, muestreo para comunicación), terminaré usando aún más almacenamiento y potencia de procesamiento. Parece una reacción en cadena, ¿verdad?

Entonces, para detener la explosión del uso de la memoria, podemos hacer algo más. Y gracias por los científicos y los primeros especialistas en arquitectura. Podemos usar la biblioteca <stdint.h> . Viene con los siguientes bonos:

  1. Puede ayudarnos a definir el ancho exacto de la variable int .
  2. Esto también nos ayuda para la portabilidad.
  3. También nos ayuda con la legibilidad.

Simplemente lo definimos usando int8_t. Si el número que necesitábamos contar supera 128 pero se mantiene por debajo de 255, aún podemos usar números enteros de 8 bits usando el tipo de datos uint8_t. De esta manera ahorramos memoria al procesador y otras municiones para otras tareas complicadas.

Así que aquí están los diferentes tipos que puede usar

int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t

En resumen, siempre esté muy atento a lo siguiente al decidir el tipo de datos para su aplicación integrada.

  1. Utilice siempre tipos portátiles de tamaño fijo para mayor claridad y robustez.
  2. Consulte con los encargados del sistema o use la física para estimar el rango requerido y el tipo más pequeño.

© Copyright 2021 - 2022 | unogogo.com | All Rights Reserved