NHÚNG. nhúng dùng 1 hay nhiều CPU dựa trên vi ñiều. ngữ và C. nhúng; sử dụng ñược các hệ ñiều hành nhúng cơ bản (FreeRTOS).

Similar documents
NHÚNG. Vi ñiều khiển BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

CẤU TRÚC DỮ LIỆU NÂNG CAO

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Tài liệu hướng dẫn: Stored Procedure

Chương 5. Network Layer 19/09/2016 1

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

BẢO MẬT TRONG SQL SERVER

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

SIMULATE AND CONTROL ROBOT

TỔNG QUAN VỀ.NET VÀ C#

Mô hình dữ liệu quan hệ (Relational data model)

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

LÂ P TRI NH WEB ASP.NET

PHÁT TRIỂN ỨNG DỤNG WEB

Bài 10: Cấu trúc dữ liệu

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

SIEMENS INDUSTRIAL NETWORKS

Bài tập lớn số 1. Giả lập bộ định thời

Exceptions. Outline 7/31/2012. Exceptions. Exception handling is an important aspect of objectoriented. Chapter 10 focuses on:

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

STACK và QUEUE. Lấy STACK

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Nhấn nút New để tạo 1 biến mới Trang 17

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

Bài 7: Các cấu trúc điều khiển

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

Đa ngôn ngữ (Internationalization) trong Servlet

Tình huống 1: PPPoE với Username và Password

Cập nhật ResultSet trong JDBC

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

GV: Phạm Đình Sắc or

Lecture 12. Trees (1/2) Nội dung bài học:

Các kiểu định địa chỉ họ MSC-51

Google Search Engine. 12/24/2014 Google Search Engine 1

Tạo Project với MPLAB

Entity Framework (EF)

Phần 1: Hướng dẫn sử dụng PictureBox tạo Slide Show

Kích hoạt phương thức xa (RMI- Remote Method Invocation )

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Hướng dẫn cài đặt FPT

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Khoa Công Nghệ Thông Tin Trường Đại Học Cần Thơ. Những hỗ trợ tiên tiến khác của SQL. Đỗ Thanh Nghị

HỆ THỐNG FILE TRÊN PC

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

BELGIUM ONLINE APPOINTMENT

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

Tìm hiểu Group Policy Object và các ví dụ

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Tính kế thừa-2. Bởi: Thanh Hiền Vũ. Định nghĩa lại các thành viên lớp cơ sở trong một lớp dẫn xuất:

Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MINICHAT. Bài giảng 3. Trang1. Khoa Khoa Học Và Kỹ Thuật Máy Tính

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

JAVASCRIPT. Giảng viên : Ths. PHẠM ĐÀO MINH VŨ

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

LAB IP SLA Bài 1. Bùi Quốc Kỳ ***

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

biến Global có thể được áp dụng cho tất cả các extension trong tất cả các context trong Dialplan.

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

Lập trình chuyên nâng cao. Lập trình phân tán (Distributed computing

ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN: AN NINH MẠNG

Dọn "rác" Windows 7 vào dịp cuối năm

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

1 Bước 1: Test thử kit LaunchPad.

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

Time Picker trong Android

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

HTML DOM - Forms. MSc. nguyenhominhduc

I. Hướng Dẫn Đăng Nhập:

LẬP TRÌNH 8051 SỐ HỌC VÀ LÔ GIC

MA NG MA Y TI NH (Computer Networks)

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

Parallels Cloud Server 6.0

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

TỔNG QUAN LẬP TRÌNH JAVA

Nội dung. Thêm về Java 2. Nguyễn Việt Hà

BÀI 6a LẬP TRÌNH ĐA TUYẾN (MULTI THREAD)

Khuôn dạng Gói tin IP

Transcription:

LẬP TRÌNH HỆ THỐNG NHÚNG BÙI QUỐC BẢO BỘ MÔN KỸ THUẬT ðiện TỬ-ðH BK TP.HCM Mục tiêu môn học Tự mình thiết kế phần mềm cho một hệ thống nhúng dùng 1 hay nhiều CPU dựa trên vi ñiều khiển (8051, ARM) dựa trên một phần cứng có sẵn. Phần mềm ñược thiết kế có cấu trúc, dựa trên ngôn ngữ cấp cao (C) hoặc sử dụng cả hợp ngữ và C. Nắm ñược lý thuyết cơ bản về hệ ñiều hành nhúng; sử dụng ñược các hệ ñiều hành nhúng cơ bản (FreeRTOS). 1

Tài liệu tham khảo C and the 8051, 3 rd Edition, Thomas Schultz Embedded C, Michael J Pont ðánh giá kết quả Giữa kỳ: 20% Bài tập lớn: 30% Cuối kỳ: 50% 2

Khái niệm về hệ thống nhúng Hệ thống nhúng là sự kết hợp giữa phần cứng máy tính và phần mềm, ñược thiết kế ñể thực hiện một chức năng chuyên biệt. Người sử dụng một hệ thống nhúng không cần biết rằng hệ thống có một máy tính bên trong VD: remote TV, lò vi sóng, Vi xử lý trong hệ thống nhúng Họ 8086 PowerPC MIPS Họ 8051 PIC Tùy thuộc vào ứng dụng và giá thành, người thiết kế quyết ñịnh loại vi xử lý dùng trong hệ thống nhúng. 3

Vi xử lý dùng trong môn học này 8051 ARM Ngôn ngữ lập trình Assembler C 4

Lý do sử dụng ngôn ngữ C C cho phép lập trình có cấu trúc. Ngôn ngữ C cho phép dễ dàng truy cập ñến cấu trúc phần cứng (ví dụ thông qua con trỏ) C ñược dùng rất phổ biến. Hầu hết các họ vi xử lý ñều ñược hỗ trợ trình biên dịch C. Rất nhiều taì nguyên tham khảo (sách, ví dụ, website ) về lập trình C. Lý do dùng hợp ngữ (Assembler) Cho phép viết những chương trình có kích thước nhỏ nhất và chạy với tốc ñộ nhanh nhất. Thích hợp cho những ứng dụng có yêu cầu nghiêm ngặt về thời gian. 5

C operator = @? < >! ~ + - * / % & ^. assignment statement address of selection less than greater than logical not (true to false, false to true) 1's complement addition subtraction multiply or pointer reference divide modulo, division remainder logical or logical and, or address of logical exclusive or used to access parts of a structure C operator == <= >=!= << >> ++ -- && equal to comparison less than or equal to greater than or equal to not equal to shift left shift right increment decrement boolean and boolean or 6

+= -= *= /= = &= ^= <<= >>= %= -> add value to subtract value to multiply value to divide value to or value to and value to exclusive or value to shift value left shift value right modulo divide value to pointer to a structure Comments (chú thích) // This is a comment line /* This is a comment block */ 7

Preprocessor Directives (chỉ dẫn tiền xử lý) ðược xử lý ñầu tiên trong quá trình biên dịch Bắt ñầu bằng từ khóa # VD: #include LCD.h" #define LCD *(unsigned char volatile *)(0x1003) Key word (Từ khóa) asm auto break case char const continue default do double else extern float Insert assembly code Specifies a variable as automatic (created on the stack) Causes the program control structure to finish One possibility within a switch statement 8 bit integer Defines parameter as constant in ROM Causes the program to go to beginning of loop Used in switch statement for all other cases Used for creating program loops Specifies variable as double precision floating point Alternative part of a conditional Defined in another module Specifies variable as single precision floating point 8

Key word (Từ khóa) for goto if int long register return short Used for creating program loops Causes program to jump to specified location Conditional control structure 16 bit integer 32 bit integer store the variable onto the CPU register if space on the register is available Leave function 16 bit integer Key word (Từ khóa) signed sizeof static struct switch typedef unsigned void volatile while Specifies variable as signed (default) Built-in function returns the size of an object Stored permanently in memory, accessed locally Used for creating data structures Complex conditional control structure Used to create new data types Always greater than or equal to zero Used in parameter list to mean no parameter Can change implicitly Used for creating program loops 9

Dấu chấm phẩy (semicolons) Chấm dứt câu lệnh VD: For (i=0;i<1000;i++); Dấu hai chấm (colons) Dùng ñể ñịnh nghĩa 1 nhãn (label) VD: char Debounce(void) short Cnt; unsigned char LastData; Start: Cnt=0; /* number of times Port C is the same */ LastData=PORTC; Loop: if(++cnt==100) goto Done; /* same thing 100 times */ if(lastdata!=portc) goto Start;/* changed */ goto Loop; Done: return(lastdata); } 10

Dấu phẩy (Commas) Dùng ñể ngăn cách các phần tử. VD: unsigned short begintime, endtime, elapsedtime; short add(short x, short y) ; Dấu nháy (Apostrophes) Dùng ñể xác ñịnh ký tự VD: mych='a' ; 11

Dấu nháy kép (Quotation marks ) Dùng ñể xác ñịnh chuỗi (string) VD: unsigned char Name[] = embedded"; Dấu ngoặc nhọn (braces) Dùng ñể bắt ñầu và kết thúc một khối câu lệnh VD: For (i=0;i<100;i++) { delay(100); PORTB = 0xff; delay(100); PORTB = 0x00; } 12

Dấu ngoặc vuông (Brackets ) Dùng ñể chỉ kích thước của mảng (array) và chỉ số VD: short fifo[100]; I = fifo[0]; Dấu ngoặc tròn (Parentheses ) Bao quanh danh sách tham số VD: add(x,y); Xác ñịnh mức ñộ ưu tiên thực thi của các biểu thức VD: X = (17+3)/2 ; 13

Biến tĩnh (Static) Biến tĩnh là biến mà giá trị của nó ñược giữ trong suốt quá trình chương trình chạy, nhưng chỉ truy cập ñược bên trong chương trình mà nó ñược ñịnh nghĩa Biến tĩnh char sumit(void) static char sum = 0; sum = sum + 1; return sum; } void main(void) char i; char result; for(i=0;i<10;i++) result = sumit(); } 14

Từ khóa volatile Từ khóa volatile mô tả 1 biến mà giá trị có thể thay ñổi không ñoán trước ñược. Biến volatile ñược dùng ñể mô tả: Các ngoại vi ñược thiết kế theo kiểu memory-mapped Biến toàn cục mà bị thay ñổi giá trị trong trình phục vụ ngắt Biến toàn cục ñược truy cập bởi nhiều tác vụ trong các ứng dụng ña tác vụ Từ khóa volatile void main(void) unsigned char xdata *p = (char xdata *) 0x8000; while (*p == 0); } void main(void) volatile unsigned char xdata *p = (char xdata *) 0x8000; while (*p == 0); } 15

Từ khóa extern Dùng ñể chỉ biến ñược ñịnh nghĩa trong 1 module khác. VD: Trong module LCD.h, khai báo biến char LCD_value; Trong module main.h extern char LCD_value; Biến ñược khởi tạo trước short Temperature = -55; const unsigned short Steps[4] = {10, 9, 6, 5}; char Name[4] = "Jon"; char Name[6] = "Jon"; char Name[] = "Jon"; char *NamePt = "Jon"; 16

Con trỏ (pointer) Con trỏ là 1 biến chứa một ñịa chỉ Giá trị của con trỏ có thể thay ñổi ñược Question: Khai báo biến a: int a; ðịa chỉ của biến a: &a có phải là con trỏ hay không? Con trỏ int *p; p = 0x8000; int *p = (int *)0x8000; int k; p = &k; #define SW *(unsigned char volatile *)(0x2000) 17

Phép toán với con trỏ Phép cộng: Con trỏ luôn chỉ vào ñịa chỉ ñầu của một ñối tượng (object). Cộng 1 vào con trỏ làm nó chỉ ñến ñối tượng tiếp theo. Phép so sánh: Khi so sánh 2 con trỏ, giá trị chúng ñang mang ñược coi như số không dấu int *p; p 0x01 0x2000 int *k; p = 0x2000; k 0x00 0x02 0x00 0x2001 0x2002 0x2003 *p = 1; k = p+1; *k = *p+1; 18

Mảng và chuỗi (array and string) Mảng là tập hợp các biến giống nhau có cùng tên gọi. Các phần tử của mảng ñược xác ñịnh bằng chỉ số (bắt ñầu từ 0). Kích thước của mảng là cố ñịnh. VD: int a[4] = {1,2,3,4}; int b = a[0]; Mảng và chuỗi (array and string) Chuỗi tương tự mảng, ngoại trừ: Chuỗi có thể có số lượng phần tử thay ñôỉ. Các phần tử của chuỗi là ký tự ASCII kết thúc bằng giá trị 0. Chuỗi ñược khai báo như 1 con trỏ kiểu char char * mystring = embedded ; 19

Kiểu cấu trúc (structure) Một structure là tập hợp của nhiều biến. Các biến trong struct có thể khác kiểu nhau. struct theport int mode; // 0 for I/O, 1 for in only -1 for out only unsigned char volatile *addr; // pointer to its address unsigned char volatile *ddr; // pointer to its direction reg }; struct theport PortA, PortB, PortC; Structure struct theport int mode ; // 0 for I/O, 1 for in only -1 for out only unsigned char volatile *addr ; // pointer to its address unsigned char volatile *ddr ; // pointer to its direction //reg } PortA, PortB, PortC; 20

struct theport int mode; // 0 for I/O, 1 for in only -1 for out only unsigned char volatile *addr; // pointer to its address unsigned char volatile *ddr; // pointer to its direction reg }; typedef struct theport port; port PortA, PortB, PortC; Struct typedef struct int mode ; // 0 for I/O, 1 for in only -1 for out only unsigned char volatile *addr ; // pointer to its address unsigned char volatile *ddr ; // pointer to its direction //reg } port; port PortA, PortB, PortC; 21

Truy cập phần tử con của struct PortC.mode=0; PortC.addr=(unsigned char volatile *)(0x1003); PortC.ddr=(unsigned char volatile *)(0x1007); (*PortC.ddr)=0; (*PortB.addr)=(*PortC.addr); Truy cập struct thông qua pointer port PORTA; port *p; p = &PORTA; p->mode=0; (dùng dấu -> ñể truy cập phần tử con của 1 con trỏ kiểu struct) 22

Khởi tạo struct port PortE={1, (unsigned char volatile *)(0x100A), (unsigned char volatile *)(0)}; Struct and union typedef struct { union { IO uint32_t u32ispcon; struct IO uint32_t ISPEN:1; IO uint32_t BS:1; I uint32_t RESERVE0:2; IO uint32_t CFGUEN:1; IO uint32_t LDUEN:1; IO uint32_t ISPFF:1; IO uint32_t SWRST:1; IO uint32_t PT:3; I uint32_t RESERVE1:1; IO uint32_t ET:3; I uint32_t RESERVE2:17; } ISPCON; }; union IO uint32_t u32ispadr; IO uint32_t ISPADR; } }FMC_T; #define AHB_BASE (( uint32_t)0x50000000) #define FMC_BASE (AHB_BASE +0x0C000) #define FMC ((FMC_T *)FMC_BASE) FMC->ISPCON.ISPEN = 1 FMC->ISPADR = 0x20000000; 23

Function (Hàm, chương trình con) Một chương trình lớn thường ñược chia thành nhiều khối (module) Module là 1 tác vụ nhận dữ liệu vào (input), xử lý và xuất ra kết quả (output). Các module ñược tạo ra như là các hàm (function). Function Một module (Nguồn: EmbeddedProg/Developing Embedded Software in C) int FtoC(int TempF){ int TempC; TempC=(5*(TempF-32))/9; // conversion return TempC;} Note: Hạn chế truy cập ñến biến toàn cục và I/O trong 1 function 24

Mô tả hàm (function declaration) Mô tả hàm cho ta biết tên hàm, kiểu của các tham số và kiểu kết quả trả về. // declaration input output void Ritual(void); // none none char InChar(void); // none 8-bit void OutChar(char letter); // 8-bit none short InSDec(void); // none 16-bit void OutSDec(short i); // 16-bit none char Max(char in1,char in2); // two 8-bit 8-bit int EMax(int in1,int in2); // two 16-bit 16-bit void OutString(char* mystring); // pointer to 8-bit none char *alloc(int size); // 16-bit pointer to 8-bit int Exec(void(*fnctPt)(void)); // function pointer 16-bit ðịnh nghĩa hàm (function definition) Một ñịnh nghĩa của hàm là cách mà hàm ñó thực thi. type Name(parameter list){ CompoundStatement }; int FtoC(int TempF) { int TempC; TempC=(5*(TempF-32))/9; // conversion return TempC; } 25

Mô tả hàm Một module thường bao gồm 2 file: Header file (dùng chứa các mô tả hàm). Source file (dùng chứa các ñịnh nghĩa hàm) Extern function Khi ta cần khai báo một hàm ñược ñịnh nghĩa ở một module khác, ta dùng từ khóa extern extern void InitSCI(void); extern char InChar(void); extern void OutChar(char character); 26

Truyền tham số (Arguments passing) Có hai phương pháp truyền tham số cho chương trình con: Truyền tham chiếu (call by reference) Truyền giá trị (call by value) Truyền tham chiếu (call by reference) Tham chiếu (con trỏ) ñến tham số ñược ñưa vào chương trình con. Các tính toán trong chương trình con sẽ ảnh hưởng ñến biến ñược ñược truyền vào. int increment(int *num) *num++; return *num; } Void main(void) int number = 1; int temp; temp = increment(& number ); } 27

Truyền giá trị (call by value) Giá trị của biến sẽ ñược sao chép và truyền vào chương trình con. Các phép tính trên tham số trong chương trình con không ảnh hưởng biến ban ñầu. int increment(int num) num++; return num; } Void main(void) int number = 1; int temp; temp = increment(number ); } Struct làm tham số của chương trình con struct theport int mode; // 0 for I/O, 1 for in only -1 for out only unsigned char volatile *addr; // pointer to its address unsigned char volatile *ddr; // pointer to its direction reg }; typedef struct theport port; unsigned char Input(port theport) return (theport.addr); } unsigned char Input(port *theport) return (theport->addr); } Function nào là tốt hơn? 28

Con trỏ hàm (function pointer) Con trỏ hàm là con trỏ chỉ ñến 1 hàm. int (*fp)(int); // pointer to a function with input and output int fun1(int input) return(input+1); // this adds 1 }; int fun2(int input) return(input+2); // this adds 2 }; void Setp(void) int data; fp=&fun1; // fp points to fun1 data=(*fp)(5); // data=fun1(5); fp=&fun2; // fp points to fun2 data=(*fp)(5); // data=fun2(5); }; Question: Giải thích sự khác nhau giữa: int (*fp)(int); int *fp(int); 29

Con trỏ hàm là tham số của 1 hàm khác int fun1(int input){ return(input+1); // this adds 1 }; int fun2(int input){ return(input+2); // this adds 2 }; int execute(int (*fp)(int)) int data; data=(*fp)(5); // data=fun1(5); return (data); }; void main(void) int result; result=execute(&fun1); // result=fun1(5); result=execute(&fun2); // result=fun2(5); }; Hàm callback Hàm callback là hàm ñược gọi khi có 1 sự kiện xảy ra. MyButton void create_button( int x, int y, const char *text, function callback_func ); MyButton ButtonClickedEvent callback_func click 30

Ví dụ về hàm callback void cbfunc() { printf("called"); } int main () { /* function pointer */ void (*callback)(void); /* point to your callback function */ callback=(void *)cbfunc; /* perform callback */ callback(); return 0; } Truyền tham số cho hàm callback typedef struct _myst int a; char b[10]; }myst; void cbfunc(myst *mt) fprintf(stdout,"called %d %s.",mt->a,mt->b); } int main() /* func pointer */ void (*callback)(void *); //param myst m; m.a=10; strcpy(m.b,"123"); /* point to callback function */ callback = (void*)cbfunc; /* perform callback and pass in the param */ callback(&m); return 0; } 31

Chỉ dẫn tiền biên dịch (Preprocessor Directives ) #define size 100 int data[size]; #define LCD *(unsigned char *)0x2000 Chỉ dẫn tiền biên dịch (Preprocessor Directives ) #ifdef A #endif #ifndef B #endif 32

Chỉ dẫn tiền biên dịch (Preprocessor Directives ) #define Debug #define LCD *(unsigned char *)0x2000 void LCD_write(char data) #ifdef Debug printf( entering LCD_write ); #endif LCD = data; #ifdef Debug printf( exitting LCD_write ); #endif return; } Debug macro #ifdef PRGDEBUG #define DBG(x) printf(x) #else #define DBG(x) /* nothing */ #endif 33

Chỉ dẫn tiền biên dịch (Preprocessor Directives ) #include "Filename" #include <Filename> 34