ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม...

49
1 ภาษาซีสาหรับ AVR Microcontroller รศ.ณรงค์ บวบทอง ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยธรรมศาสตร์

Transcript of ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม...

Page 1: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

1

ภาษาซส าหรบ AVR Microcontroller

รศ.ณรงค บวบทองภาควชาวศวกรรมไฟฟาและคอมพวเตอร

คณะวศวกรรมศาสตร มหาวทยาลยธรรมศาสตร

Page 2: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

วตถประสงค

เพอใหมความเขาใจเกยวกบภาษา ซ

เพอใหเขยนโปรแกรมภาษา ซ ส าหรบไมโครคอนโทรลเลอรได

2

Page 3: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ความรเบองตนของภาษา C

พ.ศ.2515 เดนนส รตช (Dennis Ritchie) ไดพฒนาภาษา C ขน พ.ศ. 2531 ไดรปแบบมาตราฐานของภาษา C ทเรยกวา ANSI-C

3

Page 4: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวแปลภาษา C ส าหรบ AVR Microcontroller

WinAVRTM (pronounced "whenever") is a suite of

executable, open source software

development tools for the Atmel AVR series

of RISC microprocessors hosted on the Windows platform. It includes the GNU GCC

compiler for C and C++.

4

Page 5: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

รปแบบโครงสรางภาษา C

5

1. Header File

2. ประกาศคาคงทและตวแปรชนดโกลบอล

3. ฟงกชน

4. ฟงกชน main

Page 6: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

การประกาศ Header File หรอพรโพรเซสเซอรไดเรคทฟ(Preprocessor Directive)

6

ในสวนนจะเปนการแจงใหคอมโพลเลอรทราบถงไฟล ตางๆ ทเกบ ชดค าสงทซพยสามารถจะเรยกใช

ได เปนชดค าสงทไดเตรยมใหซพยสามารถเรยกใช

ไดภายในโปรแกรม โดยกอนทจะมการคอมไพลโปรแกรมใหเปนภาษาเครองนนคอมโพลเลอรจะแปลค าสงในสวนนกอน เชน

// ชดค าสงมาตรฐานอนพท เอาทพท#include <stdio.h>

//ชดค าสงอนพทเอาทพทพอรทของ AVR#include <avr/io.h>

Page 7: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวน Preprocessor

#include <AT89X051.h>

เปนไฟล Preprocessor ของตระกล AT89C1051 และ AT89C2051

#include <avr/io.h>

ชดค าสงอนพทเอาทพทพอรทของ AVR

7

คอมโพลเลอร ใชสวนนเปนบอกใหรวาในไมโครคอนโทรลเลอรเบอรนนมอะไรบาง เชนรจสเตอรและบตควบคมตางๆ ของคอนโทรลเลอรนน การประกาศใชเครองหมายชารป (#) และไดเรกทฟ include รวมกบชอไฟลทบอกรายละเอยดของคอนโทรลเลอร

Page 8: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนไลบราร (Library)

#include <stdio.h>

ประกอบดวยฟงกชนทใชตดตอกบพอรทอนกรม ตวอยางฟงกชนไดแก printf _getkey getchar gets putchar puts scanf sprintf sscanf ungetchar vprintf และ vsprintf

#include <math.h>

ประกอบดวยฟงกชนทใชค านวณทางคณตศาสตร

#include <string.h>

ประกอบดวยฟงกชนทใชจดการเกยวกบสตรง (String) และบฟเฟอร (Buffer)

#include < intrins.h >

ประกอบดวยฟงกชนเกยวกบการหมนบต และการตรวจสอบสถานะของเลขแบบ Floating-point

8

ไลบรารเปนไฟลทมฟงกชนบรรจอยภายใน ไฟลนมนามสกลเปน .h มาพรอมกบตวแปล สามารถตรวจสอบไดจากไฟล Help

การประกาศใชไดเรกทฟ #include แลวตอดวยชอไฟล

Page 9: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนประกาศคาคงทและตวแปรชนดโกลบอล

9

การก าหนดคาคงท และชอแทน (Definitions)เปนการก าหนดชอแทนใหกบคาคงท หรอชดค าสง ตางๆ#define max_time 10 #define cpu_clk 8000000

การประกาศคาตวแปร (Declarations)เปนการประกาศใชงานตวแปรดวยการก าหนดตวแปร และชนดขอมลของตงวแปร เชนunsigned char i,j; // ประกาศคาตวแปร i และ j เปน

// ชนด unsigned char int max = 10; //ประกาศคาตวแปร max เปน

// ชนด int พรอมทงก าหนดคาเรมตน

Page 10: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนการใชงานรวม (Global Declarations)

ตวแปรแบบใชงานรวมหรอ

ตวแปรแบบโกลบอล

หมายถงตวแปรทสามารถเรยกใชไดทกทภายในโปรแกรม

การประกาศใหตวแปรเปนแบบโกลบอล ใหประกาศใวนอกขอบเขตของสวนโปรแกรมใดๆ

ตวแปรแบบโลคล (Local)

ตวแปรใชใดเฉพาะภายในสวนของโปรแกรมใดโปรแกรมหนง

การประกาศใหประกาศใวภายในโปรแกรมทตองการใชงาน

10

/*----------------------------------------------*/

#include <avr/io.h>

#include <stdio.h>

unsigned int i;

Static void delay_1s(void)

{

}

/*------MAIN C function -------------------*/

void main (void)

{

char c;

USART_Init(51);

while (1)

{

delay_1s();

fprintf (&uart_str"\nYou program\n");

}

}

Page 11: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนคาคงทของโปรแกรมการประกาศคาคงทในภาษา C ใชไดเรกทฟ #defined แลวตามดวยคาคงทดงน

#define setValue 99 ก าหนดคา setValue ใหเปน 99

หรอใชแทนการเขยนค าสงเพอใหสอความหมายไดชดเจน

#define LED_ON PORTD |= 0b00000001

#define LED_OFF PORTD &= 0b11111110

11

Page 12: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนของการสรางฟงกชน

12

เปนสวนทผใชงานสามารถสรางฟงกชน หรอโปรแกรมยอยเพอการใชงานตางๆ ไดเองตามทตองการ โดยปกต จะเขยนไวกอนฟงกชน main ( ) เพอใหฟงกชน main ( ) สามารถเรยกใชงานฟงกชนตางๆ ทเราสรางขนมาได

Page 13: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ฟงกชน (Function) โปรแกรมหนงๆ จะมกฟงกชนกได

ตองมฟงกชนหลกอยหนงฟงกชน ใชเปนฟงกชนส าหรบเรมการท างานของโปรแกรม เรยกฟงกชนนวา main

สวนของค าสงของฟงกชนจะอยภายในวงเลบปกกา { }และสามารถก าหนดใหมการสงผานตวแปรได หรออารกวเมนตของฟงกชน (Function Arguments) ถาไมตองการใหสงตวแปรเขาจะใชค าวา void ใวภายในวงเลบและถาไมมการสงคาคน จะใสค าวา void ใวหนาชอฟงกชน ตามมาตราฐาน ANSI C มไดสงสด 31 ตว ตวอยางเชน

void func_abcd(void)

{

…………………………..

}

void delay_ms(int t) //ฟงกชนนม อารกวเมนตหรอพารามเตอรสงใหฟงกชน 1 ตว

{

}

13

Page 14: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ฟงกชน main ( )

14

ส าหรบฟงกชนนถอเปนฟงกชนหลกของโปรแกรมภาษา C ทจ าเปนตองมเสมอและจะมไดเพยงฟงกชนเดยวเทานน หนาทส าคญของฟงกชนนคอ เปนจดเรมตนการท างานของโปรแกรมนนเอง ดงนนในการเขยนโปรแกรมจงเรมตนทฟงกชนนเสมอ

Page 15: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สวนหมายเหต (Comment)

เปนสวนทใหผเขยนโปรแกรมใชอธบายความหมายของโปรแกรมหรอค าสงทเขยน เพอใหงายตอการท าความเชาใจ สวนนตองอยในเครองหมาย /* …… */ หรออยหลงเครองหมาย //

/*----------------------------------------------------------------------------------

Set serial port for 9600 baud at 11.0592 MHz. Note that we use Timer 1

for the baud rate generator.

---------------------------------------------------------------------------------*/

/* ------------------------- Main Function -------------------------------*/

// PS2 I/P Program

15

Page 16: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ขอก าหนดอนๆ

ค าสงสวนใหญตองเขยนดวยอกษรตวพมพเลก ตวแปรสามารถตงชอเปนตวพมพเลกหรอใหญกไดแตตองเรยกใชให

ถกตามตวพมพ และตองไมตรงกบค าสงวนของตวคอมไพเลอรทใช ทกค าสงตองมเครองหมาย ; แสดงการจบค าสง และสามารถเขยน 1

ค าสงใน 1 บรรทดหรอจะเขยนตอกนยาวกได แตกจะท าใหแกไขโปรแกรมไดยาก

ค าสงใดๆในโปรแกรมสามารถมเลเบลไดถาตองการ และตองมเครองหมาย : ตามทายดวย

16

Page 17: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ขอระบอนๆ

นพจน (Expressions)

คอการกระท าระหวางตวด าเนนการ (Operators) กบตวกระท า (Operands) เพอใหเกดคาใดคาหนง

i = j+10;

สเตทเมนต (Statements)

หมายถงค าสงเพอใหเกดการท าการตามความตองการ

while(i<10)

{

a = i+3;

i = i+1

}

Page 18: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวอยาง/*----------------------------------------------*/

#include <avr/io.h>

#include <stdio.h>

unsigned int i;

Static void delay_1s(void)

{

}

/*------MAIN C function -------------------*/

void main (void)

{

char c;

USART_Init(51);

while (1)

{

delay_1s();

fprintf (&uart_str"\nYou program\n");

}

}

18

การประกาศ Preprocessor ชดค าสงอนพทเอาทพทพอรทของ AVR

การประกาศไลบราร stdio ส าหรบฟงกชนการใชงานพอรทอนกรม และ ไลบราร ctype

เรยกใชฟงกชน delay_1s

การเขยนฟงกชน

สวนหลกของโปรแกรม ไมมการสงขอมลเขาและไมมขอมลออก

ฟงกชน printf เปนการสงขอมลออกทางพอรทอนกรม

Page 19: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

คาคงทและตวแปรชนดของตวแปร

19

ชนด (Type) ชอแทน ชวงของคาทเกบ(Range)

Bits Bytes

char 8 1 -128 to +127

signed char int8_t 8 1 -128 to +127

unsigned char uint8_t 8 1 0 to 255

int 16 2 -32768 to +32767

signed int int16_t 16 2 -32768 to +32767

unsigned int uint16_t 16 2 0 to 65535

long 32 4 -2147483648 to 2147483647

signed long int int32_t 32 4 -2147483648 to 2147483647

unsigned long int uint32_t 32 4 0 to 4294967296

signed long long int int64_t 64 8

unsigned long long int uint64_t 64 8 0 to 2^64

float 64 8 3.4x10-38 to 3.4x1038

ขนาดความกวาง

Page 20: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวด าเนนการตวด าเนนการทางคณตศาสตร

เครองหมาย ความหมาย

+ บวก

- ลบ

* คณ

/ หาร

% หารแบบใชเศษของการหาร(Mod)

20

Page 21: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวด าเนนการ ตวด าเนนการทใชในการแปลงคา

เครองหมาย ความหมาย= น าคาทางขวามาใหทางซาย++ เพมคาขน 1-- ลดคาลง 1+= เพมคาเทากบคาทางขวา-= ลดคาเทากบคาทางขวา*= น าตวเองคณกบคาทางขวา/= น าตวเองหารกบคาทางขวา%= น าตวเองหารกบคาทางขวาเอาเศษ&= น าตวเองมาAND กบคาทางขวา|= น าตวเองมา OR กบคาทางขวา^= น าตวเองมา XORกบคาทางขวา<<= น าตวเองมาเลอนบตไปทางซายจ านวนครงเทากบคาทางขวา>>= น าตวเองมาเลอนบตไปทางขวาจ านวนครงเทากบคาทางขวา

21

Page 22: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวด าเนนการตวด าเนนการทใชในการเปรยบเทยบและตวด าเนนการทางบต

เครองหมาย ความหมาย== เทากบ!= ไมเทากบ! ตรงกนขาม(NOT)&& และ (AND)>= มากกวาหรอเทากบ<= นอยกวาหรอเทากบ|| หรอ(OR)< นอยกวา> มากกวา

22

เครองหมาย ความหมาย

& AND บต

| OR บต

^ XOR บต

<< Left shift บต

>> Right shift บต

~ One' Complement (Inverse)

Page 23: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

อะเรยและพอยนเตอร (Array and Pointer)

ตวแปรอะเรย

ตวแปรอะเรย คอกลมของตวแปร เชนกลมของตวแปร char กลมของตวแปร int สมาชกของกลมตวแปรนมจ านวนจ ากด เฉพาะเจาะจง เมอก าหนดจ านวนแลวไมสามารถลดหรอเพมได ดงนนการก าหนดอะเรยส าหรบไมโครคอนโทรลเลอรตองค านงถงหนวยความจ าทมใชงานดวย อะเรยนสามารถก าหนดใหเปนแบบหลายๆมตได ขนอยกบวาตวแปรภาษายอมใหมไดเทาไร

รปแบบการก าหนดอะเรย

แบบ 1 มต ชนดของตวแปร ชอตวแปร[n]

แบบ 2 มต ชนดของตวแปร ชอตวแปร[n][m]

โดย n และ m หมายถงจ านวนสมาชก

23

Page 24: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวอยางตวแปรและการก าหนดคาใหกบตวแปร

x เปนตวแปร y เปนตวแปร 1 มต z เปนตวแปร 2 มต

24

void main( void ){

unsigned char x, y[3], z[2][3];x = 4;y[0] = 1;y[1] = 2;y[2] = 3;

z[0][0] = 10;z[0][1] = 11;z[0][2] = 12;z[1][0] = 13;z[1][1] = 14;z[1][2] = 15;

}

Page 25: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวแปรแบบพอยเตอร (Pointer)

ตวแปรพอยเตอรหรอตวแปรตวช เปนตวแปรทมความส าคญมากในภาษาซ เพราะวาใหความยดหยนในการใชงานไดด คลายกบภาษาแอสเซมบล ตวแปรแบบพอยเตอรมหนาทเกบต าแหนงของตวแปรอนๆ วาอยทใดในหนวยความจ า

รปแบบการก าหนดตวแปรพอยเตอร

ชนดของตวแปร *ชอตวแปร

25

Page 26: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวอยางการใชตวแปรแบบพอยเตอร

เปนการก าหนดพอยเตอรข น 2 ตว เพอใช

ชต าแหนงของหนวยความจ าขอมลภายใน

ต าแหนงท 40H

และต าแหนงท 50H

และระบตวแปร a เปนแบบ Unsigned char

การอานขอมลจากหนวยความจ ามาใว ท a กจะอานทละ 8 บต

เทานน แตถาระบ a เปนตวแปรแบบอนเชน char กานอานกจะท าทละ 16 บต ดงนนการก าหนดชนดตวแปรนตองระมดระวงใหด

26

void main( void )

{

unsigned char *ptr1;

unsigned char *ptr2;

unsigned char a;

ptr1 = 0x40;

ptr2 = 0x50;

a = *ptr1;

a = a+5;

*ptr2 = a;

}

Page 27: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวอยางการใชตวแปรแบบพอยเตอร 2

27

unsigned char c;

#include <avr/io.h>

int main(void)

{

unsigned char *ptr1;

unsigned char *ptr2;

unsigned char a,c,i;

unsigned char mydata[10];

DDRD = 0x00;

PORTD = 0XFF;

DDRB = 0XFF;

c = PIND;

// = start address of mydata

ptr1 = &mydata;

// = end address of mydata + 1

ptr2 = &mydata+1;

for(i=1;i<11;i++)

{

mydata[i-1] = i;

}

*ptr1 = c;

a = *ptr1;

a = a+5;

*ptr2 = a;

c = *ptr2;

PORTB = c;

}

Page 28: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ค าสงควบคมตางๆในภาษา C

If

if-else

Switch

For

While

do-while

GOTO

28

Page 29: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ค าสง

break หยดการท างานของลป และออกจากลป

continue;ตรงขามกบค าสง break การท างานของค าสง continune จะบงคบให โปรแกรมกระโดดขามไปท างานในรอบตอไปเลยโดยไมตองท าค าสงทอยถดไป

for (i=0;i<10;i++) {

if(i==5) {

continune; } printf("%d\n\r",i);

}

Page 30: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

30

ตวอยางโปรแกรมไฟกระพรบท พอรท D บต 0#define F_CPU 1000000UL /* 1 MHz CPU clock */#include <stdio.h>#include <util/delay.h>#include <avr/io.h>#define LED_ON PORTD |= 0b00000001 #define LED_OFF PORTD &= 0b11111110 int main(void){

DDRD = 1; while(1)

{LED_ON; _delay_ms(500);LED_OFF; _delay_ms(500);

}}

Page 31: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

Intel HEX file format

Intel HEX file format (*.HEX) เปนไฟลรหส ASCII ซงสามารถใช โปรแกรม EDITOR ทวไปเรยกขนมาดได

:BC AAAA TT HHH...HHCC : เครองหมายโคลอน ใชเปนตวเรมตนขอมล BC จ านวนไบทของขอมลในเรคคอรด มคาเปนเลขฐาน 16 (HEX) (เปน 00 ถาเปนเรคคอรดสนสดไฟล)

AAAA เปนแอดเดรสขอมลไบทแรกในเรคคอรด TT แสดงชนดของเรคคอรด

= 00 ถาเปนเรคคอรดขอมล = 01 ถาเปนเรคคอรดสนสดไฟล

HH ขอมล 1 ไบท จ านวนตามทระบไว ใน BC CC คาของ CHECKSUM ซงเปนคา two's complement ของผลบวก ของขอมลทกไบท ในเรคคอรด

Page 32: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

ตวอยางไฟลเฮกซ

:10 0000 00 0C 94 2A 00 0C 94 3F 00 0C 94 3F 00 0C 94 3F 00 89

:100010000C943F000C943F000C943F000C943F0064

:100020000C943F000C943F000C943F000C943F0054

:00000001FF

Page 33: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

33

โปรแกรมท 7.2 โปรแกรมควบคมไฟวง#include < at89x051.h > /* Include 89C2051 header file */

#include <intrins.h> /*Intrinsic functions for C51. */

void wait (void)

{ ; /* wait function */

}

void main( void )

{ unsigned int i;

unsigned char a;

unsigned char b;

a = 0x01;

while(1)

{

P1 = a;

b = _crol_(a,1);

a = b;

for ( i = 0; i < 10000; i++ )

{

wait(); /* delay for 97 ms */

}

}

}

Page 34: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

จบ

34

Page 35: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

สไลดถดจากนไปเปนตวอยางเอาใวศกษา เกยวกบเรอง pointer

access hardware

35

Page 36: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

36

C Programming - Review

Types

Functions

Libraries

Pointers

Run-time memory allocation – malloc

Page 37: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

37

C Programming - Review

Types

• char, int, float, double

• short, long

• signed, unsigned

• const, volatile

• static, auto, extern

Page 38: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

38

C Programming - Review

Functions• Prototype/declaration

• double function( int input_variable );

• Definition• double function( int input_variable )

• { double temp;

• temp = sqrt( (double )input_variable);

• return( temp );

• }

Page 39: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

39

C Programming - Review

Libraries#include <stdio.h>

#include <math.h>

#include “my_functions.h”

main()

{ int var=0;

double var2;

var2 = function( var );

}

#include “my_functions.c”

Page 40: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

40

C Programming - Review

Pointers• Variable containing addresses

int var, array[4], *ptr;

ptr = &var;

*ptr = 5; /* equiv. to var = 5; */

ptr = &array[1];

var = (*ptr); /* equiv. to var = array[1]; */

• *ptr on left side of argument, data is stored into memory at that address

• *ptr on right side of argument, data is retrieved from memory at that location

Page 41: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

41

C Programming - Review

Run-time memory allocation – malloc

#include <stdio.h>

#include <stdlib.h>

main()

{ int *ptr;

ptr = (int *)malloc( sizeof( int ) );

free( ptr );}

Page 42: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

42

Accessing Hardware from within C

Although C is a high-level language, itstill allows the programmer to remain intouch with the hardware of a machine.

The microprocessor(s) of a computersystem are capable of addressing anumber of memory locations - theaddress space.

Page 43: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

43

Accessing Hardware from within C

A system will have a given amount of RAM, whereprograms and data (e.g. variables) are temporarilystored by programs. The address returned bypointers and function names is an address in theaddress space.

The hardware devices of a system are alsoaccessible in the address space of themicroprocessor. Each device, such as an A/D chip,serial controller etc, will have a unique address orrange of addresses usually taken up by its registers.

Page 44: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

44

Accessing Hardware from within C

Any hardware device (or memory location) inthe address space can be accessed via itsaddress and the indirection operator, *.

The address of a device can be stored in apointer; the type of pointer depends on thedevice being accessed. Often registers areone byte (8 bits) wide and are bestrepresented by pointers to type char,specifically unsigned char.

Page 45: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

45

Accessing Hardware from within C

It is good practice to create a type to use with

the registers:

• typedef unsigned char BYTE;

• BYTE *control_reg;

The address of the device has to be assigned

to the pointer. Normally the address contained

in a pointer is supplied by the operating system via the address operator, & or malloc, etc.

Page 46: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

46

Accessing Hardware from within C

The address of a hardware device will not be known by the compiler so it must be supplied by the programmer. The onus is then on the programmer to ensure that the address is valid.

Addresses can be assigned directly, usually in hexadecimal:• control_reg = 0x1000;

• /* supply address 1000 in hex */

Such a statement may attract a warning from the compiler. An assignment of this nature should involve a cast as a means of indicating that the programmer knows what s/he is doing:• control_reg = (BYTE *)0x1000;

• /* address is cast */

Page 47: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

47

Accessing Hardware from within C

Reading and writing bytes to this location can now be achievedby using the * operator.

If a register wider than 8 bits is to be accessed, this can doneby using a pointer of different type.

Example• typedef unsigned int WORD;• WORD *data_register = (WORD *)0x3000;• *data_register = 0x55aa;

Will write:• 0x55 to address 0x3000 and

• 0xaa to address 0x3001, assuming that the pointer contains the least significant address

of an object.

Page 48: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

48

Accessing Hardware from within C

The volatile type qualifier should be used

for variables that can change outside the

scope of the function. This is relevant for

variables which change as a result of hardware

interrupts or input/output ports.

Example: #define PORTA *(unsigned

char volatile *)(0x0000)

Page 49: ภาษาซีส าหรับ - t U...ว ตถ ประสงค เพ อให ม ความเขา ใจเก ยวกบ ภาษา ซ เพ อให เข

49

ทมทมเขาสอบทไรใชลอกเพอนครขเตอนจะไลออกถาจบไดสอบปลายปทมจงไมลอกใครท าไมไดกระดาษเปลาเอาสงคน

พวกเพอนเพอนทใหทมไดลอกสอบเสรจบอกกบทมวาอยาขมขน

ขนาดกดหนงสอมาทงคนกยงยนกระดาษเปลาเอาสงคร

ทมโมโหตดพอแลวตอวากอตสาหไมลอกมงตามค าขมงดนสงกระดาษเปลาเอาเหมอนกเดยวคณครเขารหรอกวาลอกกน