Wei Dongshan ARM bare metal e enciclopédia uboot (1ª versão aprimorada) notas de estudo 11-lição 011 _ uso da porta serial

Uma base de conhecimento de porta serial

  1. Nível
    TTL TTL é Transistor-Transistor Logic, a abreviatura de Transistor-Transistor Logic, que é uma tecnologia padrão para comunicação entre várias partes do equipamento controlado por um processador de computador. O sinal de nível TTL é amplamente utilizado porque sua representação de dados adota regulamentos binários, + 5 V é equivalente à lógica "1" e 0 V é equivalente à lógica "0".

Em circuitos digitais, o nível do circuito composto de componentes eletrônicos TTL é uma faixa de tensão, que estipula:
nível alto de saída> = 2,4 V, nível de saída baixo <= 0,4 V;
nível alto de entrada> = 2,0 V, potência de entrada baixa Ping <= 0,8 V.
Insira a descrição da imagem aqui
2. Nível RS232 O nível
RS232 é um padrão para portas seriais.
Nas linhas de dados TXD e RXD:
  (1) Lógica 1 é uma tensão de -3 ~ -15 V
  (2) Lógica 0 é uma tensão de 3 ~ 15 V Nas
linhas de controle de RTS, CTS, DSR, DTR e DCD:
  ( 1) O sinal é válido (estado LIGADO) é uma tensão de 3 ~ 15V
  (2) O sinal é inválido (estado DESLIGADO) é uma tensão de -3 ~ -15V
Isso é regulado pelo protocolo de comunicação RS-232.

RS-232: Porta serial padrão, a interface de comunicação serial mais comumente usada. Existem três tipos (A, B e C), que usam tensões diferentes para representar ligado e desligado. O mais amplamente usado é RS-232C, que define a tensão do bit de marca (on) entre -3V e -12V, e a tensão espacial (off) entre + 3V e + 12V. A distância máxima de transmissão é de cerca de 15 metros e a velocidade máxima é de 20 kb / s. RS-232 é projetado para comunicação ponto a ponto (ou seja, apenas um par de equipamentos de recepção e envio) e sua carga de driver é de 3-7kΩ. Portanto, RS-232 é adequado para comunicação entre dispositivos locais.
Insira a descrição da imagem aqui

Em segundo lugar, implemente a função printf para depuração bare metal do zero

  1. printf é uma função de biblioteca padrão, a função é: print (variável, string) e assim por diante.
    Pergunta: Você pode escrever uma função my_printf simples para depurar programas bare metal com base no princípio de printf?
  2. Protótipo de função
//====================================================
//printf的声明
int printf(const char *format, ...);
//format:固定参数
//...   :可变参数(变参)
  1. A função usa
    Insira a descrição da imagem aqui
    os caracteres de formato no exemplo printf
    Insira a descrição da imagem aqui
  2. parâmetro variável

1) Revisão do indicador da linguagem c

2) Código: determine manualmente os parâmetros variáveis

① Chamada de funçãopush_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);   
	...
}

② Chamada de função

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

Como implementar a push_testfunção?

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);   
}

③Como na plataforma x86 (máquina de 32 bits), o padrão do compilador GCC é o alinhamento de 4 bytes,
como: a estrutura está alinhada com 4 bytes, ou seja, o endereço de memória da variável do membro da estrutura é um inteiro múltiplo de 4 .
O tamanho do alinhamento especificado pode ser definido usando a opção __attribute__ no 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)));

④No processo de transferência de parâmetro variável: números de ponto flutuante são transferidos como variáveis ​​duplas por padrão.

3) Código: determine automaticamente os parâmetros variáveis

Acho que você gosta

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