CPUとは

中央処理装置, プロセッサとも.

  • 仕様で決められた一連の命令セットを実行できる.
  • 記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで解釈・実行することで情報の加工を行う.

Intel

i5

一般向け.

i7

高性能.

i9

AMD

Intelよりも効率がいい.

💻レジスタ

Registers are high-speed storage inside the processor.

コンピュータのプロセッサなどが内蔵する記憶回路で, 制御装置や演算装置や実行ユニットに直結した, 操作に要する速度が最速の, 比較的少量のものを指す.

一般に, 論理回路において, フリップフロップなどにより状態を保持する装置をレジスタと呼ぶ. コンピュータにおいては, プロセッサが内蔵しているそれを指す. プロセッサには, プログラムが読み書きできるレジスタ以外に, プロセッサ自身が動作するためのレジスタがあり, 内部レジスタなどと呼ばれる.

レジスタ (コンピュータ) - Wikipedia

データを記憶したり取り出したりすることができる順序回路. out (t) = out (t-1) を実現する.

Register のプログラムでの扱い

Pin を操作するためのレジスタには, アドレス空間の決められたアドレスが割り振られている. (仕様)

プログラムでは, あらかじめ Define を利用してレジスタのアドレスを宣言するのが王道. volatile をつけることで, コンパイラが最適化してアドレスを変更するのを防ぐ.

#define PA5   (*((volatile unsigned long *) 0x40004080))

これは以下と同値.

data = (*((volatile unsigned long *) 0x40004080));
data = 0x40004080;
data = (*0x40004080);

そうすると, 以下のようにして Register の値を Read/Write できる.

# Register Write
PA5 = 0x20;
# Register Read
data = PA5;

初期設定はこんな感じ.

void PortF_Init (void){ volatile unsigned long delay;
  SYSCTL_RCGC2_R |= 0x00000020;   // 1) F clock
  delay = SYSCTL_RCGC2_R;         // delay
  GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0
  GPIO_PORTF_CR_R |= 0x1F;        // allow changes to PF4-0
  GPIO_PORTF_AMSEL_R &= 0x00;     // 3) disable analog function
  GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL
  GPIO_PORTF_DIR_R &= ~0x11;      // 5.1) PF4,PF0 input,
  GPIO_PORTF_DIR_R |= 0x08;       // 5.2) PF3 output
  GPIO_PORTF_AFSEL_R &= 0x00;     // 6) no alternate function
  GPIO_PORTF_PUR_R |= 0x11;       // enable pullup resistors on PF4,PF0
  GPIO_PORTF_DEN_R |= 0x1F;       // 7) enable digital pins PF4-PF0
}

L チカ Example 抜粋

// symbolic names instead of addresses
#define GPIO_PORTF_DATA_R    (*((volatile unsigned long *) 0x400253FC))
#define GPIO_PORTF_DIR_R     (*((volatile unsigned long *) 0x40025400))
#define GPIO_PORTF_AFSEL_R   (*((volatile unsigned long *) 0x40025420))
#define GPIO_PORTF_PUR_R     (*((volatile unsigned long *) 0x40025510))
#define GPIO_PORTF_DEN_R     (*((volatile unsigned long *) 0x4002551C))
#define GPIO_PORTF_LOCK_R    (*((volatile unsigned long *) 0x40025520))
#define GPIO_PORTF_CR_R      (*((volatile unsigned long *) 0x40025524))
#define GPIO_PORTF_AMSEL_R   (*((volatile unsigned long *) 0x40025528))
#define GPIO_PORTF_PCTL_R    (*((volatile unsigned long *) 0x4002552C))
#define SYSCTL_RCGC2_R       (*((volatile unsigned long *) 0x400FE108))
 
// 2. Declarations Section
//   Global Variablesp
unsigned long SW1; // input from PF4
unsigned long SW2; // input from PF0
 
// Subroutine to initialize port F pins for input and output
// PF4 is input SW1 and PF2 is output Blue LED
void PortF_Init (void){ volatile unsigned long delay;
  SYSCTL_RCGC2_R |= 0x00000020;   // 1) F clock
  delay = SYSCTL_RCGC2_R;         // delay
  GPIO_PORTF_LOCK_R = 0x4C4F434B; // 2) unlock PortF PF0
  GPIO_PORTF_CR_R |= 0x1F;        // allow changes to PF4-0
  GPIO_PORTF_AMSEL_R &= 0x00;     // 3) disable analog function
  GPIO_PORTF_PCTL_R &= 0x00000000; // 4) GPIO clear bit PCTL
  GPIO_PORTF_DIR_R &= ~0x11;      // 5.1) PF4,PF0 input,
  GPIO_PORTF_DIR_R |= 0x08;       // 5.2) PF3 output
  GPIO_PORTF_AFSEL_R &= 0x00;     // 6) no alternate function
  GPIO_PORTF_PUR_R |= 0x11;       // enable pullup resistors on PF4,PF0
  GPIO_PORTF_DEN_R |= 0x1F;       // 7) enable digital pins PF4-PF0
}
 
void FlashSOS (void){
  //S
  GPIO_PORTF_DATA_R |= 0x08;  delay (1);
  GPIO_PORTF_DATA_R &= ~0x08; delay (1);
  GPIO_PORTF_DATA_R |= 0x08;  delay (1);
  GPIO_PORTF_DATA_R &= ~0x08; delay (1);
  GPIO_PORTF_DATA_R |= 0x08;  delay (1);
  GPIO_PORTF_DATA_R &= ~0x08; delay (1);
  //O
  GPIO_PORTF_DATA_R |= 0x08; delay (4);
  GPIO_PORTF_DATA_R &= ~0x08;delay (4);
  GPIO_PORTF_DATA_R |= 0x08; delay (4);
  GPIO_PORTF_DATA_R &= ~0x08;delay (4);
  GPIO_PORTF_DATA_R |= 0x08; delay (4);
  GPIO_PORTF_DATA_R &= ~0x08;delay (4);
  //S
  GPIO_PORTF_DATA_R |= 0x08; delay (1);
  GPIO_PORTF_DATA_R &= ~0x08;delay (1);
  GPIO_PORTF_DATA_R |= 0x08; delay (1);
  GPIO_PORTF_DATA_R &= ~0x08;delay (1);
  GPIO_PORTF_DATA_R |= 0x08; delay (1);
  GPIO_PORTF_DATA_R &= ~0x08;delay (1);
  delay (10); // Delay for 5 secs in between flashes
}

Topics

自分のCPUの世代を調べる

lscpu | grep “Intel”