From afd42664b3975bcb8c4e635faec401b67964f39a Mon Sep 17 00:00:00 2001 From: GuTaoZi Date: Thu, 2 Jan 2025 02:41:41 +0800 Subject: [PATCH] Regular update - CV updated - Posts updated --- content/CV_Site_Fan.pdf | Bin 56018 -> 56360 bytes content/_index.md | 2 +- content/posts/CS301_Review.md | 940 ++++++++++++++++++ content/{posts => temp_posts}/CS301_Notes.md | 0 content/{posts => temp_posts}/EE411_Notes.md | 1 + content/temp_posts/EE411_Review.md | 72 ++ .../Hadoop_Cluster_Setup.md | 0 7 files changed, 1014 insertions(+), 1 deletion(-) create mode 100644 content/posts/CS301_Review.md rename content/{posts => temp_posts}/CS301_Notes.md (100%) rename content/{posts => temp_posts}/EE411_Notes.md (99%) create mode 100644 content/temp_posts/EE411_Review.md rename content/{posts => temp_posts}/Hadoop_Cluster_Setup.md (100%) diff --git a/content/CV_Site_Fan.pdf b/content/CV_Site_Fan.pdf index 1ddb6d1db98688312b3014983a4a7a86cd13a222..92fc7c4c155ea99a6bb89924213a7e9c92ef6c71 100644 GIT binary patch delta 22407 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 LNZgS2Kg9n9I2+3S delta 22045 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 diff --git a/content/_index.md b/content/_index.md index a19b74c..58380e7 100644 --- a/content/_index.md +++ b/content/_index.md @@ -47,7 +47,7 @@ My primary research focus involves **building reliable and efficient systems**, - B.Eng. Candidate in Computer Science and Engineering, *2021.09 - Expected 2025.06* - GPA: 3.92/4.00, ranking top 1 with an honored degree from the 2021 Turing Class. -- 2023 National Scholarship, 2022-2024 Outstanding Student Scholarships, 2023 Top 10 etc. +- 2023 National Scholarship, 2022-2024 Outstanding Student Scholarships, 2023 Top 10 Outstanding Volunteers etc. ## Teaching & Activities diff --git a/content/posts/CS301_Review.md b/content/posts/CS301_Review.md new file mode 100644 index 0000000..5bfa68e --- /dev/null +++ b/content/posts/CS301_Review.md @@ -0,0 +1,940 @@ +--- +title: CS301 Embedded System and Microcomputer Principle +tags: [Embedded System] +categories: CS +description: Review notes for Embedded System and Microcomputer Principle, in reverse order +date: 2024-12-31 +--- + +## Outline + +1. Introduction +2. STM32 MCU & GPIO +3. I²C and SPI +4. SD Card and File System +5. Bus +6. ADC +7. DMA and Pipeline +8. Arithmetic + +## Lecture 14 Arithmetic + +### Barrel Shifter + +| Mnemonic | Name | Description | Example(shift 4 bits) | +| -------- | ---------------------- | ---------------- | ---------------------- | +| LSL | Logical Shift Left | C<-MSB, LSB<-0 | 11111111->11110000 | +| LSR | Logical Shift Right | 0->MSB, LSB->C | 11111111->00001111 | +| ASR | Arithmetic Shift Right | MSB->MSB, LSB->C | 10000000->11111000 | +| ROR | Rotate Right | LSB->MSB, LSB->C | 00001111->11110000 | +| RRX | Rotate Extended | C->MSB, LSB->C | C,10000000->0,C1000000 | + +The ARM barrel shifter is placed in the Datapath, so we can shift the second operand before it is used for arithmetic operations, like `MOV`, `ADD`, `ADC`, `SUB`, `RSB`, `AND`, `EOR`, `ORR`, `BIC`. + +```assembly +ADD r4, r4, r4, LSL#4 +# Multiply R4 by 17 +RSB r5, r5, r5, LSL#5 +# Multiply R5 by 31 +``` + +### ALU Adder + +#### Ripple Carry Adder + +A cascaded connection of n full-adder blocks. + +{{}}
+ +
{{
}}Problem: each cell causes a propagation delay, $n$ delays for $n$-bit addition + +#### Carry Lookahead Adder + +{{}}
+ +
{{
}} + +$G=A \text{ AND } B$ + +$P=A \text{ XOR } B$ + +$C_{i+1}=G_{i}+C_{i} \text{ AND } P_{i}$ + +$S_{i}=P_i\text{ XOR }C_i$ + + The critical carry path now has 8 propagation delays for a 32 bit adder. + +#### Carry Select Adder + +Compute both the results with/without the carry, optimizing the propagation to Log complexity. + +| Width | Ripple | Lookahead | Select | +| :---: | :----: | :-------: | :----: | +| 4 | 4 | 1 | 1 | +| 8 | 8 | 2 | 1 | +| 16 | 16 | 4 | 2 | +| 32 | 32 | 8 | 3 | +| 64 | 64 | 16 | 4 | + +### Multiplier + +#### Matrix Multiplier + +Carry-save adder: during addition, save the carry bits instead of propagating them, then add the carry with the sum. + +Carry-save adders can be used on all addition but the final sum, which uses standard adder. + +{{}}
+ +
{{
}} + +#### Sequential Multiplier + +- In each step, one bit of the multiplier is selected +- If the bit is logic 1, the multiplicand is shifted left to form a partial product, and it’s added to the partial sum + +#### Booth Multiplier + +Booth's algorithm + +| Current bit | Bit to the right | Equiv Bit | Operation | +| :---------: | :--------------: | :-------: | :-------: | +| 0 | 0 | 0 | 0 | +| 0 | 1 | +1 | +M | +| 1 | 0 | -1 | -M | +| 1 | 1 | 0 | 0 | + +Sometimes worse than normal + +Booth2 + +| $Q_{i+1}Q_iQ_{i-1}$ | Equiv value at pos $i$ | Operation | +| :-----------------: | :--------------------: | :-------: | +| 000 | 0 | +0 | +| 001 | 1 | +M | +| 010 | 1 | +M | +| 011 | 2 | +2M | +| 100 | -2 | -2M | +| 101 | -1 | -M | +| 110 | -1 | -M | +| 111 | 0 | +0 | + +Multiplication requiring only n/2 summands. + +## Lecture 13 DMA and Pipeline + +### Direct Memory Access + +**Why Need DMA?** + +Data transfer between I/O device and memory w/o DMA (programmed I/Os): + +- Each pure data transfer requires 2 cycles: load + store +- waste of CPU instructions: maintaining memory address and number bytes moved +- high overhead and slow + +Transferring blocks of data between the external device and the main memory, or between memories, without continuous intervention by the processor. + +DMAC: control unit for DMA transfer, a peripheral moving data. + +**DMA transfer mode** + +- Burst Mode + - Entire block in one continuous operation + - Efficient but CPU remains inactive for long +- Interleaving Mode + - Transfer only when no conflict with CPU for system bus or memory access, ensuring no interference +- Cycle Stealing Mode + - DMAC takes control, transfer one word of data, then releases control back to the CPU + - Allows CPU to continue executing its instruction between transfers + +Upon bus/memory access conflict, CPU is stalled, but may still executing instructions w/o cache miss. + +**DMA Controller** + +- **Memory address register (CMAR)** + - contains the address to specify the desired location in memory +- **Peripheral register (CPAR)** + - contains the address to specify the desired location in peripheral +- **Word count register (CNDTR)** + - contains the number of words to be transferred +- **Configuration register (CCR)** + - specifies the configurations like transfer mode + +**DMA Operation** + +- With CPU + - CPU tells DMAC: + - Data transfer direction between Mem and I/O + - Starting address of memory block for data + - Amount of data to be transferred + - CPU carries on with other work + - DMA controller deals with transfer (with peripheral↓) + - DMA controller sends interrupt when finished +- With peripheral + - When data available, I/O device places a signal on DMA-request wire + - DMAC gets the memory bus + - place the desired address on the memory-address wire + - place a signal on the DMA-ACK wire + - Transfer begins + +DMA uses bus matrix to allow concurrent transfers. + +| I/O Interrupt Transfer | DMA Transfer | +| -------------------------------------- | ----------------------------------- | +| Software control, needs context switch | Hardware control, no context switch | +| Slow transfer | Fast transfer | +| CPU involved | CPU not involved | +| No need for extra hardware | Need DMAC | +| Can used for exception handling | Data transfer only | +| Small data transfer | Large data transfer | + +### Bit Banding + +```text +bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4) +``` + +### ARM Architecture - Pipeline + +On a 32-bit memory system, ARM code is 40% faster than Thumb code. + +- performance-centered + +On a 16-bit memory system, Thumb code is 45% faster than ARM code. + +- memory cost and power consumption + +ARM code for the critical routines and Thumb code for backgrounds tasks + +**ARM7 3-stage pipeline** + +- Fetch + - increment PC + - read next instruction +- Decode + - control signal generation + - read from register file +- Execute + - arithmetic/logic operation + - calculation branch address + - load/store + +**Structure hazards**: different instructions in different stages conflicting for the same resource + +**Control hazard**: fetch cannot continue because it does not know the outcome of an earlier branch + +**Interrupt latency**: + +- [interrupt signal received, the first instruction being executed] +- The minimum latency for an IRQ is 7 clock cycles + +Split data buses for instructions and data to eliminate bus conflicts. + +## Lecture 12 ADC + +### ADC introduction + +**ADC**: a circuit that takes in an analog voltage and produces a digital representation of its value. + +Sampling rate: frequency of measuring the analog signal + +Sampling resolution: depth of bits representing each sample + +The ADC has $n$-bit resolution, $2^n$ steps, with step size $\frac{V_{ref}}{2^n}$. + +$\text{Output} = \text{round}(2^N\times \frac{V_{input}}{V_{ref}})$. + +### ADC Architectures + +{{}}
{{
}} + +**Successive-approximation (SAR)** + +SAR involves iteratively approximating the input analog voltage by comparing it with a series of binary-weighted voltage levels until a digital output is obtained. + +Usually $n$ cycles for $n$-bit ADC. + +**Flash ADC / Parallel ADC** + +A series of comparators, each one comparing the input signal to a unique reference voltage. The comparator outputs connect to the inputs of a priority encoder circuit, which then produces a binary output. + +| ADC Architecture | Resolution | Sampling Rate | Cost | +| :--------------: | :--------: | :-----------: | :--: | +| SAR ADC | High | Low | Low | +| Flash ADC | Low | High | High | + +### STM32 ADC + +- regular group: SQ1-SQ16, 16 channels +- injected group: JSQ1-4, 4 channels +- injected group has a higher priority + +**Modes** + +- Single conversion mode + - Sample one channel once +- Continuous conversion mode + - Continuously sample one channel +- Scan mode + - Sample multiple channels in specified order +- Discontinuous mode + - Divide channels into groups, need to trigger before converting each group + +**Sample time** + +$T_\text{ADC}=T_\text{Sampling}+T_\text{Conversion}$ + +Sampling time is defined in `ADCx_SMPR` register (1.5-239.5 cycles). + +Conversion time is 12.5 ADC clock cycles. + +| SMP | Sample time | SMP | Sample time | +| :--: | :---------: | :--: | :---------: | +| 000 | 1.5 | 100 | 41.5 | +| 001 | 7.5 | 101 | 55.5 | +| 010 | 13.5 | 110 | 71.5 | +| 011 | 28.5 | 111 | 239.5 | + +## Lecture 11 Bus + +### Bus Architecture + +Bus: a shared communication link between subsystems + +- Each line or wire of a bus can at any one time contain a single binary digit. +- Time Division: + - At any given moment, only one component is allowed to send information to the bus. Multiple components send information to the bus in different time slots. +- Shared: + - Multiple components can be connected to the bus, and each component can exchange information through this set of lines. + +**Bus Classification** + +- Data transfer format + + - Serial + + - Parallel + +- Connectivity + + - In-chip bus: connection between components within a CPU + + - System bus: links components like CPU, memory and I/O devices + - Address bus (uni-directional) + - CPU r/w data from memory/devices by addressing a unique location + - Data bus (bi-directional) + - data transfer + - Control bus (bi-directional) + - signal requests and ACKs + - data type + + - Communication bus: connects external devices + +- Timing control + + - Synchronous + - Asynchronous + +**Bus Architectures** + +- Single level: System bus + - Facilitates adding/removing I/O devices + - Conflicts occur when multiple components need to use the bus + - Priority needs to be determined +- Two level: Memory bus + I/O bus + - IOP: a processor with specialized functions that can uniformly manage I/O devices. The channel program is stored in main memory. + - Support burst transfer (see *burst transfer* in DMA transfer mode) +- Three level: Memory bus + I/O bus + DMA bus + - memory centralize with DMA, data transfer between I/O devices and main memory does not require CPU intervention +- Multi-level + - Allowing various components to connect efficiently while maintaining high performance and data integrity. + +### Bus Performance + +**Performance** + +- width + - number of bits of data transmitted in the same time +- frequency + - bus operating speed +- bandwidth = width × frequency + - The amount of data transmitted on a bus within a specific time + +### [Arbitration](https://www.geeksforgeeks.org/bus-arbitration-in-computer-organization/) + +#### Centralized Arbitration + +**Daisy Chain** + +- All bus masters use the same line for bus request +- Bus grant signal is propagated serially through all masters starting from nearest one + +**Counter Arbitration** + +- An additional device line is used +- A counter enumerates all the masters through the device line + +**Independent Request Arbitration** + +- Each master has its own bus request and grant lines +- Bus is granted by bus controller based on the priority + +#### Distributed Arbitration + +- The arbiters are located within each device + - The bus device arbiter sends its own arbitration number onto the shared bus. + - The arbiter compares the arbitration number it receives from the bus with its own to determine priority. + - If its own priority is lower, it withdraws its arbitration number + - The highest-priority arbiter remaining on the bus gains control of the bus. + +### Bus Timing + +#### Bus cycle + +1. Request + - device sends request signal + - arbitration if multiple devices contending for bus access +2. Addressing + - master sends address and control signal to the bus +3. Transfer + - data transmission +4. Complete + - master removes relevant information from the bus and releases bus control + +#### Bus Timing + +**Synchronous** + +controlled by a clock, support burst transfer + +**Asynchronous** + +handled by well-defined specifications, i.e., a response is delivered within a specified time after a request + +**SOC Bus Architecture** + +Advanced Microcontroller Bus Architecture (AMBA) + +AMBA2.0->AHB->ARM Cortex-M + +**AMBA2.0** + +- IP reuse +- flexibility +- compatibility +- well supported + +**Advanced High-performance Bus **(AHB) + +- high performance +- CPU<->High-speed memory<->DMA controllers +- high bandwidth +- multiple master supported + +**Advanced Peripheral Bus** + +- low-power peripheral bus +- low-speed peripheral devices<-> system bus +- timers, GPIO controllers, UART etc. +- low-speed, low-power applications + +## Lecture 10 SD Card & File System + +### Massive Storage + +**Static Random Access Memory (SRAM)** + +- low density, high power, expensive, fast +- power off -> content loss +- often used for caches + +**Dynamic Random Access Memory (DRAM)** + +- high density, low power, cheap, slow +- need refreshing regularly +- used for main memory + +**Disk Storage** + +A sector records its ID and the data. + +1. queue for other pending accesses +2. seek: move the heads +3. rotational latency +4. data transfer +5. controller overhead + +**Volatile Memory**: SRAM, DRAM + +**Non-Volatile Memory**: Disk, ROM, EPROM/Flash + +Mask ROM + +EPROM + +EEPROM + +Flash Memory + +### Secure Digital Card + +initialize, r/w, get status. + +- SD mode + - clock + - 4 data lines +- SPI mode + - clock + - card select + - 2 data lines + +### File System + +FAT 16 -> FAT 32 -> exFAT + +block/cluster: set of sectors + +FAT is designed to solve fragmentation + +- chop the storage into equal sized blocks +- fill the empty space in a block-by-block manner + +1. read root dir and get the 1st block number +2. read the FAT, find the next block +3. continuously find the next block until -1 + +| Format | FAT12 | FAT16 | FAT32 | +| --------------------- | ----- | ----- | --------------- | +| Cluster address width | 12 | 16 | 28 (4 reserved) | +| Numbers of clusters | 4K | 64K | 256M | + +**FAT read** + +1. read from initial cluster + - the file size may help determining if the last cluster is reached. +2. look for the next cluster +3. continue to access the next cluster until EOF + - the file size help determining how many bytes to read from the last cluster. + +**FAT write** + +1. locate the last cluster +2. start writing to the non-full cluster +3. allocate the next cluster through FSINFO +4. Update the FATS and FSINFO +5. When write finishes, update the file size + +**FAT delete** + +1. de-allocate blocks involved. Update FSINFO and FATS +2. change the first byte of the directory entry to `_` + +The storage device control module is storage dependent (e.g., SD card driver), it needs to be provided by the implementer. + +## Lecture 10 I²C and SPI + +### Inter-Integrated Circuit (I²C) + +Designed for low-cost, medium data rate applications + +- 2-wire communications +- Synchronous, half-duplex +- Start/Stop/Ack + +**Characteristics** + +- Serial, byte-oriented +- Multi-master bus with master and slave devices + - Collision detection and arbitration +- 2 bidirectional open-drain lines, plus ground + - Serial data line (SDA), Serial clock line (SCL) + - Float high/Drive low +- Up to 100 kbit/s in the standard mode, up to 400 kbit/s in the fast mode + +**Communication steps** + +1. Master -> Slave: **START** +2. Master -> Slave: **address + direction** +3. Slave -> Master: **ACK** +4. Transmitter -> Receiver: **one-byte data** +5. Receiver -> Transmitter: **ACK** +6. Repeat 4 and 5 until transmission done +7. Master -> Slave: **STOP** + +**Start/Stop Signals** + +- START (S) + - SDA 1->0 transition when SCL=1 +- STOP (P) + - SDA 0->1 transition when SCL=1 +- Repeated Start (Sr) + +**Data Frame** + +- transmitter 8 bits + receiver 1 ack bit +- MSB transferred first + +**Addressing Scheme** + +- Master->Slave: slave address(7 bit) + write/read (1 bit) +- Slave->Master: ack (1 bit) + +**Signal Synchronization** + +- SCL=1, SDA remains stable +- SCL=0, transmitter sends a bit of data onto the data line + +**Bus arbitration** + +- *Wire-AND* bus is used: high voltage only when two senders both drive the line to high. +- For SCL (clock), keeping low if SCL of one of the masters is low +- SDA used for arbitration + - During data transfer, the master constantly checks whether the SDA voltage level matches what it has sent. + - When two masters generate a START setting concurrently, the first master which detects SDA low while it has intended to set SDA high will lose the arbitration and let the other master complete the data transfer. + +\*Extended details: the losing master will not send STOP to avoid interfering the winning slave, just leaves the losing slave receiving wrong messages and let the protocol to handle this. + +### Serial Peripheral Interface (SPI) + +Characteristics + +- Synchronous full-duplex communication +- Single master, multiple slaves +- No Start/Stop or slave acknowledgment +- Master sets corresponding Slave Select (SS) signal to communicate with slave device +- More than 10 Mbit/s + + + +- MSB transferred first (endian-programmable) +- Data line changed by the sender on a rising(falling) edge, then read by the receiver on the following falling(rising) edge. +- No ACK +- Clock provided by the master +- Master shifts out a bit to, and shifts in a bit from slave +- Only master can starts the data transfer + - Ignore data received on writing + - Send empty data to trigger the slave to send data + +**SPI Clock Phase and Polarity** + +**CPOL**: Clock Polarity + +- Determines whether the clock line (SCLK) is idle low (0) or idle high (1). + +**CPHA**: Clock Phase + +- Determines whether data is sampled (read) on the first or second clock transition. + +| **Mode** | **CPOL** | **CPHA** | **Idle Clock Level** | **Read Edge** | **Change Edge** | +| -------- | -------- | -------- | -------------------- | ------------- | --------------- | +| 0 | 0 | 0 | Low | Rising edge | Falling edge | +| 1 | 0 | 1 | Low | Falling edge | Rising edge | +| 2 | 1 | 0 | High | Falling edge | Rising edge | +| 3 | 1 | 1 | High | Rising edge | Falling edge | + +### SPI vs. I²C + +- Common + - Serial, synchronous + - Short-distance communications + - Master-slave configuration +- Difference + - SPI by Motorola, I²C by Philips + - I²C is half-duplex, SPI is full-duplex + - I²C w/ ACK, SPI w/o ACK + - Addressing: broadcast vs. chip select + - I²C fixes clock polarity and phase, SPI adjustable + +## Lecture 8 Advanced Timer Functionality + +**TIMx_DIER** (DMA/Interrupts Enable Register) + +- UIE: Update Interrupt Enable +- CC1IE: Capture/Compare channel 1 Interrupt enable +- ... + +### Output Compare PWM + +{{}}
image.png
{{
}} + +| Output Compare Mode (OCnM) | Timer Output (OCREF) | +| -------------------------- | -------------------- | +| 000 | Frozen | +| 001 | High if CNT==CCR | +| 010 | Low if CNT==CCR | +| 011 | Toggle if CNT==CCR | +| 100 | Constant low | +| 101 | Constant high | +| 110 | PWM mode 1 | +| 111 | PWM mode 2 | + +**Duty Cycle** + +Percentage measuring fraction of period for which signal is HIGH + +**Pulse Width Modulation (PWM)** + +PWM (Pulse Width Modulation) is a technique to effectively obtain desired analog parameters by modulating the width of a series of pulses. + +PWM mode 1: PWM signal = Counter < CCR ? 1 : 0 + +Duty cycle 1 = CCR / (ARR + 1) + +PWM mode 2: PWM signal = Counter < CCR ? 0 : 1 + +Duty cycle 2 = 1 - (CCR / (ARR + 1)) +$$ +f_\text{CK_PWM}=\frac{f_\text{CK_PSC}}{(\text{PSC}+1)(\text{ARR}+1)} +$$ + +### Input Capture + +1. The edge detector detects an external signal transition +2. Latch the counter value into `CCR` register +3. If enabled, generate an interrupt to inform the processor to read CCR + +$$ +\text{Time span} = (\text{CCR}_\text{new}-\text{CCR}_\text{old})\times \frac{1}{f_\text{CK_CNT}} +$$ + +### System Timer + +24-bit down counter, used to initiate an action on a periodic basis + +**SysTick registers** + +- `SYSTICK_CTRL` + - SysTick control and status register + - COUNTFLAG: count done flag since last read, cleared upon read + - CLKSOURCE: 0 for external reference clock; 1 for processor free running clock + - TICKINT: 1 for enabling interrupt generation upon 1->0 transition + - ENABLE: SYSTICK timer enable +- `SYSTICK_LOAD` + - SysTick reload value register + - Max = 0x00FFFFFF + - $\text{Interval} = (\text{RELOAD} + 1)\times\text{Clock Period}$ +- `SYSTICK_VAL` + - SysTick current value register + - Generates an interrupt on 1->0 transition, invoke `SysTick_Handler()` + - Clearing the counter and COUNTFLAG + +## Lecture 7 Timer Introduction + +Software delay loops + +- Waste of processor +- Difficult to translate into actual time +- Difficult to translate into number of iterations +- Unpredictable delays: compiler optimization, interrupts etc. + +Stable clocks are essential for watchdog timers, timers, asynchronous communications etc. + +STM32 clocks + +- Quartz Crystal Oscillators + - Accurate and stable +- RC/LC/RLC oscillators + - Simple and cheap +- Phase-locked loop + - increase external low-frequency clock to a higher-frequency internal clock + +| Source | Frequency | Material | Usage | +| :----: | :--------: | :--------: | :------: | +| HSE | 4 - 16 MHz | Oscillator | SYSCLK | +| LSE | 32.768 KHz | Oscillator | RTC | +| HSI | 8 MHz | RC | SYSCLK | +| LSI | 40 KHz | RC | RTC/IWDG | + +**Timer Classification** + +- Timers + - Basic + - General-purpose + - Advanced +- SysTick +- Watchdogs + - Independent (IWDG) + - Windowed (WWDG) +- RTC + +**STM32 Timers (16-bit)** + +| Type | Num | Bus | Counting Mode | Feature | +| :-------------: | :----------: | :--: | :---------------: | ------------------------------------------------------------ | +| Basic | TIM6, TIM7 | APB1 | Up | Time-base generation (Timer) | +| General-purpose | TIM2 to TIM5 | APB1 | Up, down, up/down | Time-base generation, Input capture (measuring input pulse lengths), Output compare (PWM waveform) | +| Advanced | TIM1, TIM8 | APB2 | Up, down, up/down | Time-base generation, Input capture, Output compare, and more advanced features | + +**Timer Registers** + +- `TIMx_CNT`: Counter +- `TIMx_ARR`: Auto-reload register +- `TIMx_PSC`: Prescaler register + +$$ +f_\text{CK_CNT}=\frac{f_\text{CK_PSC}}{\text{TIMx_PSC}+1} +$$ + +- `TIMx_CR1`: Control register + - CEN (Counter Enable) + - 0: counter disabled + - 1: counter enabled + - OPM (One Pulse Mode) + - 0: counter counts continuously + - 1: counter stops at the next update event + - CMS (CMS Center-aligned Mode Selection) + - DIR (Direction) + +| CMS | DIR | Counting Mode | +| :---: | :--: | -------------------- | +| 00 | 0 | Counting Up | +| 00 | 1 | Counting Down | +| Other | Any | Counting Up and Down | + +- `TIMx_SR`: Status register + - bit 0: Update Interrupt Flag (UIF) + - set by hardware upon an update event, cleared by software + - set when `CNT` reaches `ARR` in counting up mode, or reaches 0 in counting down mode. + +**Timer initialization** + +1. enable the clock to TIMx module +2. set auto-reload register `TIMx_ARR` +3. clear the UIF flag in `TIMx_SR` +4. set the counting mode, enable timer +5. Wait the UIF flag to go high +6. Counting done + +$$ +T = \frac{(\text{TIMx_ARR}+1) \times (\text{TIMx_PSC}+1)}{f_\text{CK_PSC}} +$$ + + + +## Lecture 2 STM32 MCU & GPIO + +### CPU Overview + +**ARM Cortex Families** + +- **A**pplication: support OS and high-performance applications (e.g. smartphones) +- **R**eal-time: support real-time processing and mission-critical control, with high performance and high reliability +- **M**icrocontroller: cost-sensitive, support SoC + +**Arithmetic Logic Unit** + +- Operands: from registers and from data memory + +- Operations: input from `OP` wire + +- Flags: info about the results of operations stored in Program Status Register(i.e., PSR, or C(urrent)PSR) + + - **Z**ero + + - **N**egative + + - o**V**erflow + + - **C**arry + + ```text + # PSR + | Condition Code| Reserved | Operating Mode | + | N | Z | C | V |..........|I|F|T|M4|M3|M2|M1|M0| + ``` + +- Result: into registers or data memory + +**Control Unit**: Instruction decoding \& dataflow identification + +**Program Counter**: storing address of the next instruction to be executed, updated after fetching an instruction + +### CPU Registers & Memory Map + +**ARM CPU Registers** + +- fastest way to read/write +- within the processor chip +- 32-bit wide each + +ARM Cortex-M3 Register Bank + +| Group | Number | Desc. | +| ----------------------- | ------ | -------------------------------------------------- | +| Low Register | R0-R7 | Accessible for any instructions | +| High Register | R8-R12 | Accessible for some instructions | +| Stack Pointer | R13 | Main/Process SP for priviledged/application access | +| Link Register | R14 | Return address of function calls | +| Program Counter | R15 | Address of the instruction to be executed | +| Program Status Register | CPSR | Flags of the ALU result | + +## Lecture 1 Introduction + +>*An embedded system is an application that contains at least one programmable computer.* +> +>—— Michael J. Pont, Embedded C + +**Generations of Computers:** + +| Generations | Technology | +| --------------------------------------- | ------------------- | +| First Generation (1940s - 1950s) | Vacuum tubes | +| Second Generation (1950s - 1960s) | Transistors | +| Third Generation (1960s - 1970s) | Integrated Circuits | +| Fourth/Now Generation (1970s - Present) | Microprocessors | + +**Transistor Evolution:** + +- Scaling options + - component-driven scaling (e.g., microprocessors, GPUs) + - system-driven scaling (e.g., SoC integration). +- The focus on deeper pipelines, more cache, and multi-core systems, as well as memory chips with increasing capacity. + +**Embedded Systems Overview:** + +- **Microprocessor (MPU)**: A single-chip processor for data processing and control. +- **Microcontroller (MCU)**: A processor with integrated memory and peripherals for specific tasks, e.g., embedded applications. +- **System on a Chip (SoC)**: A chip that integrates all components of a system, including CPUs, GPUs, memory, and other peripherals. + +**Differences Between General and Embedded Computer Systems:** + +- **General Systems** include a microprocessor, large memory, and operating systems. +- **Embedded Systems** are tailored for specific functions, often without traditional operating systems and with embedded software in flash memory. + +**Microcontroller Vendors**: Companies like STMicroelectronics, Microchip, TI, Intel, and NXP are prominent in this space. + +**Development Tools and Environments**: + +- **Development boards**: Used for testing software before hardware implementation. +- **IDE tools**: Cross compilers, linkers, loaders, and libraries help in developing embedded software. + +For 32-bit processor like ARM, a **word** is 32 bit. (half-word, double-word) + +| Power | Prefix | Symbol | +| :---: | :----: | :----: | +| 2^10 | Kilo | K | +| 2^20 | Mega | M | +| 2^30 | Giga | G | +| 2^40 | Tera | T | +| 2^50 | Peta | P | +| 2^60 | Exa | E | +| 2^70 | Zetta | Z | + +**Number System** + +- Radix conversion +- Signed/one's complement/two's complement + +Von-Neumann architecture vs. Harvard architecture + +High-level language -> assembly language -> hardware representation + + + +On general computer: compiler -> assembler -> linker -> loader + +In cross compilation: cross-compiler + cross-assembler -> linker/locator + +- Cross compiler runs on host but generates code for target. +- Locator creates a file containing binary image or other format, that will be copied onto target, which run on its own (not through loader) diff --git a/content/posts/CS301_Notes.md b/content/temp_posts/CS301_Notes.md similarity index 100% rename from content/posts/CS301_Notes.md rename to content/temp_posts/CS301_Notes.md diff --git a/content/posts/EE411_Notes.md b/content/temp_posts/EE411_Notes.md similarity index 99% rename from content/posts/EE411_Notes.md rename to content/temp_posts/EE411_Notes.md index 0d4f8f2..d622df1 100644 --- a/content/posts/EE411_Notes.md +++ b/content/temp_posts/EE411_Notes.md @@ -1,5 +1,6 @@ --- title: EE411 Information Theory and Coding +tags: Information Theory categories: CS description: Notes for information theory and coding date: 2024-09-24 diff --git a/content/temp_posts/EE411_Review.md b/content/temp_posts/EE411_Review.md new file mode 100644 index 0000000..b3e8f8c --- /dev/null +++ b/content/temp_posts/EE411_Review.md @@ -0,0 +1,72 @@ +--- +title: EE411 Information Theory and Coding - Review +tags: Information Theory +categories: CS +description: Review Notes for information theory and coding +date: 2024-12-24 +--- + +Since there's only calculation questions in the final exam, only calculation is covered in this note. + +### Introduction + +![](https://s2.loli.net/2023/01/01/8pS9IbAPfWXDOgt.png) + +### Entropy + +**Entropy** +$$ +H(X) = -\sum\limits_{x\in\cal{X}}p(x)\log p(x)=\mathbb E[\log\frac{1}{p(X)}] +$$ +**Joint entropy** +$$ +H(X,Y)=\mathbb E[logp(X,Y)] +$$ +**Conditional entropy** +$$ +H(Y|X) = -\sum\limits_{x\in\cal X}\sum\limits_{y\in\cal Y}p(x,y)\log p(y|x) = - \mathbb E \log p(Y|X) +$$ +**Mutual** + +### **Chain rules?** + +### **3 Inequalities** + +- info +- jensen +- markov + +### **AEP** + +typical set? + +4 properties + +### Source Coding! + +- Codes + - Nonsingular + - 优妮可莉笛蔻德保寇德 + - 普勒菲克斯寇德 +- Kraft inequality +- Mcmillan inequality +- Huffman code + +### Entropy Rate! + +- stationary + +### Channel Coding + +- joint typical set? +- joint AEP? +- Channel coding theorem? + - Achievability + - Converse + +### Differential entropy + +- relation of differential entropy to discrete entropy +- joint/conditional differential entropy +- relative entropy +- AWGN, diff --git a/content/posts/Hadoop_Cluster_Setup.md b/content/temp_posts/Hadoop_Cluster_Setup.md similarity index 100% rename from content/posts/Hadoop_Cluster_Setup.md rename to content/temp_posts/Hadoop_Cluster_Setup.md