Wei Dongshan ARM enciclopedia de bare metal y uboot (primera versión mejorada) notas de estudio 11-lección 011 _ uso del puerto serie

Una base de conocimientos sobre puertos serie

  1. TTL nivel
    TTL es Transistor-Transistor Logic, la abreviatura de Transistor-Transistor Logic, que es una tecnología estándar para la comunicación entre varias partes de equipos controlados por un procesador de computadora. La señal de nivel TTL se usa ampliamente porque su representación de datos adopta regulaciones binarias, + 5V es equivalente a un "1" lógico y 0V es equivalente a un "0" lógico.

En los circuitos digitales, el nivel del circuito compuesto por componentes electrónicos TTL es un rango de voltaje, que estipula:
nivel alto de salida> = 2.4V, nivel bajo de salida <= 0.4V;
nivel alto de entrada> = 2.0V, Ping de baja potencia de entrada <= 0,8V.
Inserte la descripción de la imagen aquí
2. Nivel RS232 El nivel
RS232 es un estándar para los puertos serie.
En las líneas de datos TXD y RXD:
  (1) La lógica 1 es un voltaje de -3 ~ -15V
  (2) La lógica 0 es un voltaje de 3 ~ 15V En las
líneas de control de RTS, CTS, DSR, DTR y DCD:
  ( 1) La señal es válida (estado ON) es un voltaje de 3 ~ 15V
  (2) La señal no es válida (estado OFF) es un voltaje de -3 ~ -15V
Esto está regulado por el protocolo de comunicación RS-232.

RS-232: puerto serie estándar, la interfaz de comunicación serie más utilizada. Hay tres tipos (A, B y C), que utilizan diferentes voltajes para representar encendido y apagado. El más utilizado es RS-232C, que define el voltaje del bit de marca (encendido) entre -3V y -12V, y el voltaje de espacio (apagado) entre + 3V y + 12V. La distancia máxima de transmisión es de unos 15 metros y la velocidad máxima es de 20 kb / s. RS-232 está diseñado para comunicación punto a punto (es decir, solo un par de equipos de recepción y envío), y su carga de controlador es de 3-7 kΩ. Por tanto, RS-232 es adecuado para la comunicación entre dispositivos locales.
Inserte la descripción de la imagen aquí

En segundo lugar, implemente la función printf para la depuración completa desde cero

  1. printf es una función de biblioteca estándar, la función es: imprimir (variable, cadena) y así sucesivamente.
    Pregunta: ¿Puede escribir una función my_printf simple para depurar programas bare metal basada en el principio de printf?
  2. Prototipo de función
//====================================================
//printf的声明
int printf(const char *format, ...);
//format:固定参数
//...   :可变参数(变参)
  1. La función usa
    Inserte la descripción de la imagen aquí
    los caracteres de formato en el ejemplo printf
    Inserte la descripción de la imagen aquí
  2. parámetro variable

1) Revisión del puntero en lenguaje c

2) Código: determinar manualmente los parámetros variables

① Llamada a funciónpush_test("abcd",123);

int push_test(const char *format, ...)
{
    
    
	char *p = (char *)&format;
	//参数1
	printf("arg1 : %s\n",format);	 
	//参数2
	p = p + sizeof(char *);
	i = *((int *)p);
	printf("arg2 : %d\n",i);   
	...
}

② Llamada a función

struct  person{
    
    
	char *name;
	int  age;
	char score;
	int  id;
};
struct  person per={
    
    "www.100ask.org",10,'A',123};
push_test("abcd",123,per);

¿Cómo implementar la push_testfunción?

int push_test(const char *format, ...)
{
    
    
	char *p = (char *)&format;
	int i;
	struct  person per;  
	
	printf("arg1 : %s\n",format);	 

    //==============
	/*指针对连续空间操作时: 1) 取值  2)移动指针*/  
	p = p + sizeof(char *);
	i = *((int *)p);
	printf("arg2 : %d\n",i);   

    //==============             
	/*指针对连续空间操作时: 1) 取值  2)移动指针*/    
	p = p + sizeof(int);  
	per = *((struct  person *)p);  
	printf("arg3: .name = %s, .age = %d, .socre=%c  .id=%d\n",\
		          per.name,   per.age,   per.score, per.id);   
}

③Debido a que en la plataforma x86 (máquina de 32 bits), el compilador GCC tiene por defecto una alineación de 4 bytes,
como por ejemplo: la estructura está alineada con 4 bytes, es decir, la dirección de memoria de la variable miembro de la estructura es un múltiplo entero de 4 .
El tamaño de alineación especificado se puede establecer usando la opción __attribute__ en gcc.

 struct  person{
    
    
	char *name;
	int  age;
	char score;
	int  id;
};
/*1):__attribute__ ((packed)),让所作用的结构体取消在编译过程中的优化对齐,
	   按照实际占用字节数进行对齐。
*/
struct  person1{
    
    
	char *name;
	int  age;
	char score;
	int  id;
}__attribute__ ((packed));
/*2):__attribute((aligned (n))),让所作用的结构体成员对齐在n字节边界上。
	  如果结构体中有成员变量的字节长度大于n,则按照最大成员变量的字节长度来对齐。
*/
struct  person2{
    
    
	char *name;
	int  age;
	char score;
	int  id;
}__attribute((aligned (4)));

④En el proceso de transferencia de parámetros de variables: los números de punto flotante se transfieren como variables dobles por defecto.

3) Código: determina automáticamente los parámetros variables

Supongo que te gusta

Origin blog.csdn.net/xiaoaojianghu09/article/details/104347647
Recomendado
Clasificación