Uma base de conhecimento de porta serial
- 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.
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.
Em segundo lugar, implemente a função printf para depuração bare metal do zero
- 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? - Protótipo de função
//====================================================
//printf的声明
int printf(const char *format, ...);
//format:固定参数
//... :可变参数(变参)
- A função usa
os caracteres de formato no exemplo printf
- 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_test
funçã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