Wei Dongshan ARMベアメタルおよびuboot百科事典(最初の拡張バージョン)スタディノート11-レッスン011_シリアルポートの使用

シリアルポートのナレッジベース

  1. TTLレベル
    TTLは、Transistor-Transistor Logicであり、Transistor-Transistor Logicの略で、コンピュータープロセッサによって制御される機器のさまざまな部分間の通信の標準テクノロジです。TTLレベル信号は、そのデータ表現がバイナリレギュレーションを採用し、+ 5Vが論理「1」に相当し、0Vが論理「0」に相当するため、広く使用されています。

デジタル回路では、TTL電子部品で構成される回路のレベルは電圧範囲であり、
出力高レベル> = 2.4V、出力低レベル<= 0.4V、
入力高レベル> = 2.0V、入力低電力Pingを規定しています。<= 0.8V。
ここに画像の説明を挿入
2.RS232レベル
RS232レベルはシリアルポートの標準です。
TXDとRXDデータ線に:
  (1)ロジック1は-3〜-15Vの電圧である
  (2)ロジック0に3〜15Vの電圧である
:RTS、CTS、DSR、DTR及びDCDの制御線
  ( 1)信号が有効(ON状態)は3〜15Vの電圧です。
  (2)信号は無効(OFF状態)は-3〜-15Vの電圧です。
これは通信プロトコルRS-232によって制御されます。

RS-232:標準シリアルポート、最も一般的に使用されるシリアル通信インターフェース。オンとオフを表すために異なる電圧を使用する3つのタイプ(A、B、C)があります。最も広く使用されているのはRS-232Cで、マーク(オン)ビット電圧を-3V〜-12V、スペース(オフ)電圧を+ 3V〜 + 12Vと定義しています。最大伝送距離は約15メートル、最高速度は20kb / sです。RS-232は、ポイントツーポイント(つまり、受信機器と送信機器のペアのみ)通信用に設計されており、そのドライバー負荷は3〜7kΩです。したがって、RS-232はローカルデバイス間の通信に適しています。
ここに画像の説明を挿入

次に、ベアメタルデバッグ用のprintf関数を最初から実装します

  1. printfは標準ライブラリ関数であり、関数はprint(変数、文字列)などです。
    質問:printfの原理に基づいてベアメタルプログラムをデバッグするための簡単なmy_printf関数を記述できますか?
  2. 関数プロトタイプ
//====================================================
//printf的声明
int printf(const char *format, ...);
//format:固定参数
//...   :可变参数(变参)
  1. この関数は
    ここに画像の説明を挿入
    、printfの例のフォーマット文字を使用します
    ここに画像の説明を挿入
  2. 可変パラメータ

1)c言語ポインタのレビュー

2)コード:変数パラメーターを手動で決定する

①ファンクションコールpush_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);   
	...
}

②ファンクションコール

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

push_test関数を実装する方法は

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

③x86(32ビットマシン)プラットフォームでは、GCCコンパイラはデフォルトで4バイトアラインメントになります。
たとえば、構造体は4バイトでアラインメントされます。つまり、構造体メンバー変数のメモリアドレスは4の整数倍です。 。
指定された配置サイズは、gccの__attribute__オプションを使用して設定できます。

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

④変数パラメータ転送の過程で:浮動小数点数はデフォルトでdouble変数として転送されます。

3)コード:可変パラメータを自動的に決定します

おすすめ

転載: blog.csdn.net/xiaoaojianghu09/article/details/104347647