Experimento de programación de estructura de datos
int main(int argc, char *argv[])
{
int c=9, d = 0;
c = c++ % 5;
d = c;
printf("d=%d\n ",d);
Devuelve 0; p>
p>
}
a) Escribir la salida del programa
b) ¿Es esta expresión riesgosa en sistemas portátiles? ¿Por qué?
#Contiene "stdio.h"
int a = 0
int b
Carga estática
int main(int argc, char *argv[])
{
char d = 4;
estática corta e;
a++;
b = 100;
c =(char)++ a;
e =(++ d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d ", a, b, c, d, e
Devuelve 0;
}
a) Escribe la salida del programa
b) Si el compilador organiza cada variable (a, El diseño de b, c, d) (como pila, montón, segmento de datos, segmento BSS) se describen mejor con gráficos.
2 Las interrupciones son una parte importante de los sistemas integrados, lo que ha llevado a muchos desarrolladores de compiladores a proporcionar una extensión: el estándar C admite interrupciones, lo que da como resultado una nueva palabra clave __interrupt. El siguiente código utiliza la palabra clave __interrupt para definir una subrutina de servicio de interrupción (ISR). Por favor comente el código a continuación.
_ _Interrumpir doble área_cómputo(doble radio)
{
Área doble = PI *radio*radio;
printf(" nArea = %f ", area);
Área de retorno;
}
3 preguntas de conocimientos básicos de C/C++
a) ¿Qué ¿Qué significa la palabra clave volátil en tiempo de compilación? Y dé tres ejemplos de diferentes escenarios de uso (se pueden describir en pseudocódigo o texto).
b) ¿Cuál es el papel específico de la palabra clave estática en lenguaje C?
c) ¿Cuáles son las diferencias entre las siguientes tres declaraciones de variables? Por favor proporcione un significado específico.
int const * p;
int * const p;
int constante * const p
4 Problemas relacionados con el sistema integrado
A) Para la variable entera A=0x12345678, dibuje cómo se almacena en la memoria en formas little-endian y big-endian.
b) En el sistema ARM, ¿cómo se pasan los parámetros al llamar a una función?
c) ¿Cuál es la diferencia entre interrupciones (como las interrupciones del teclado) y excepciones (como las excepciones de división por cero)?
5. Supongamos que los períodos de las tareas periódicas P1, P2 y P3 son T1, T2 y T3 son 100, 150 y 400 respectivamente; Diseñe un algoritmo de programación para que la programación de tareas cumpla con el ciclo de ejecución de la tarea y el ciclo de la tarea.
La inversión de prioridades es un problema grave en los sistemas integrados y se debe prestar suficiente atención.
a) Primero, explique el problema de la inversión de prioridad.
b) Muchos RTOS proporcionan herencia de prioridad y límite de prioridad para resolver el problema de la inversión de prioridad. Por favor analice estas dos estrategias.
Respuesta de referencia:
1 5
El riesgo existe porque c = c++ % 5; esta expresión modifica C dos veces y el comportamiento no está definido. es incierto.
int a = 0; //Parte de datos
int b; //Parte de datos
Carga estática c; // BSS
int main(int argc, char *argv[])
{
char d = 4; //pila
static short e;
a++;
b = 100;
c = (carácter)++ a; ++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d ", a, b, c, d, e);
Devuelve 0;
}
a=2, b=100, c=2, d=6, e=5
2 a)ISR no puede devolver un valor;
B)ISR no puede pasar parámetros;
c) El punto flotante generalmente no es reentrante;
d) El La función printf tiene problemas de reentrada y rendimiento.
3 a) Definir una variable con la palabra clave volátil equivale a decirle al compilador que el valor de esta variable cambiará en cualquier momento y que es necesario eliminar la memoria cada vez que se usa.
Vuelve a leer su valor y no optimices a tu antojo.
Lugares recomendados para usar variables variables:
(1) Registros de hardware de dispositivos paralelos
(2) Acceso no automático en rutinas de servicio de interrupción Variables (globales variables).
(3) Variables compartidas por varias tareas en aplicaciones multiproceso.
b) En el cuerpo de la función, las variables declaradas como estáticas mantienen su valor sin cambios durante la llamada de la función.
Dentro de un módulo (pero fuera de una función), las funciones utilizadas en el módulo pueden acceder a las variables declaradas como estáticas, pero no a través de otras funciones fuera del módulo.
Visita. Es una variable global local.
En un módulo, las funciones declaradas como estáticas solo pueden ser llamadas por otras funciones del módulo. Es decir, la función se limita a su declaración.
Utilizado dentro del alcance local de un módulo.
¿Cuál es la diferencia entre variables globales estáticas y variables globales ordinarias? Una variable global estática se inicializa solo una vez para evitar que se haga referencia a ella en otras unidades de archivos.
¿Cuál es la diferencia entre variables locales estáticas y variables locales ordinarias? Las variables locales estáticas solo se inicializan una vez y la siguiente vez se basa en el valor del resultado anterior;
¿Cuál es la diferencia entre funciones estáticas y funciones ordinarias? Las funciones estáticas tienen sólo una copia en la memoria, las funciones normales mantienen una copia en cada llamada.
c) Puntero a un número entero constante.
Puntero constante a un número entero.
Puntero constante a un número entero constante.
Cuatro
a) 0x12345678
Little endian y big endian son todo lo contrario.
Dirección alta -> 0x12 dirección baja -> 0x12
0x34 0x34
0x56 0x56
Dirección baja -> 0x78 dirección alta - > 0x78
b) El parámetro < =4 se pasa a través de R0~R3 y > 4 se pasa a través de la superposición.
c) Excepción: Se debe considerar la sincronización con el reloj del procesador al generar. De hecho, las excepciones también se denominan interrupciones sincrónicas. El procesador genera una excepción cuando ejecuta una instrucción incorrecta debido a un error de programación, o cuando ocurre una situación especial durante la ejecución (como una falla de página) que debe ser manejada por el kernel.
La llamada interrupción debe referirse a una señal eléctrica generada por hardware externo, que ingresa desde el pin de interrupción de la CPU, interrumpiendo el funcionamiento actual de la CPU.
El así llamado; llamada excepción se refiere al proceso de ejecución del software. Para algunos eventos que deben manejarse, la CPU genera automáticamente una trampa para interrumpir la operación actual e ir al proceso de manejo de excepciones.
La diferencia entre asíncrono y síncrono
V
Las tareas de alta prioridad deben esperar a que las tareas de baja prioridad liberen recursos, mientras que las tareas de baja prioridad esperan para tareas de prioridad media El fenómeno se llama inversión de prioridad.
Estrategia de herencia de prioridad: herede la prioridad más alta de la tarea bloqueada existente como su prioridad, y la tarea saldrá de la sección crítica y se reanudará.
Prioridades iniciales complejas.
Límite superior de prioridad: Controla el límite superior de prioridad de los semáforos que acceden a recursos críticos.
La estrategia de herencia de prioridad tiene un impacto relativamente pequeño en el proceso de ejecución de la tarea, porque solo cuando una tarea de alta prioridad se aplica a recursos clave que ya están ocupados por una tarea de baja prioridad.
Cuando esto suceda, se aumentará la prioridad de las tareas de baja prioridad.