hướng dẫn sử dụng trình biên dịch sg8-cc & ide ifast · 2016-07-01 · hướng...

90
Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast i Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast

Upload: others

Post on 17-Jan-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast i

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast

Page 2: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast ii

Mục lục

1 Đặc tả hợp ngữ của SG8V1 1

1.1 Chỉ thị tiền xử lý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 Chỉ thị tiền xử lý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.2 Chỉ thị tiền xử lý #define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.3 Các chỉ thị tiền xử lý #if, #else, #endif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.4 Các Chỉ thị tiền xử lý #ifdef và #ifndef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2 Chỉ thị hợp ngữ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2.1 Chỉ thị EQU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2.2 Chỉ thị RES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2.3 Chỉ thị DB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.2.4 Chỉ thị DW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.5 Chỉ thị DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.6 Chỉ thị UDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.7 Chỉ thị UDATA_OVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.8 Chỉ thị ORG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.9 Chỉ thị CODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.10 Chỉ thị EXTERN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.11 Chỉ thị GLOBAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.12 Chỉ thị LOCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.2.13 Chỉ thị END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.3 Tập lệnh của SG8V1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.4 Hướng dẫn hợp ngữ cho SG8V1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.4.1 Biên dịch chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.4.2 Chú thích . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.4.3 Định danh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.4.4 Hằng số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.4.5 Định nghĩa nhãn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Page 3: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast iii

2 Đặc tả ngôn ngữ lập trình 72.1 Cấu trúc chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2 Các thành phần cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2.1 Các từ khóa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2.2 Các định danh (Identifier) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.2.3 Hằng số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.3 Khai báo và kiểu dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.3.1 Các lớp phạm vi (storage class) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.3.2 Kiểu dữ liệu và thuộc tính kiểu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.3.3 Đối tượng khai báo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.3.4 Khai báo cấu trúc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.3.5 Khai báo kiểu hợp nhất . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.3.6 Khai báo enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.3.7 Khai báo mảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.3.8 Khai báo con trỏ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.3.9 Bộ khởi tạo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.3.10 Dùng typedef để định nghĩa kiểu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.4 Các biểu thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.5 Tập lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.1 Lệnh Null “;” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.2 Lệnh biểu thức . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.3 Lệnh break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.4 Lệnh khối . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.5 Lệnh continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.5.6 Lệnh if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.5.7 Lệnh else if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.5.8 Lệnh switch và case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.5.9 Lệnh do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.5.10 Lệnh while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.5.11 Lệnh for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.5.12 Lệnh goto và các lệnh có nhãn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.5.13 Lệnh return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.5.14 Lệnh __asm, __endasm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.6 Hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.6.1 Định nghĩa hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.6.2 Khai báo hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.6.3 Lệnh gọi hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.6.4 Truyền tham số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.7 Chú thích . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.8 Chỉ thị tiền tiền xử lý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.8.1 Chỉ thị #define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.8.2 Các chỉ thị #if, #else, #endif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.8.3 Các chỉ thị #ifdef và #ifndef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Page 4: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast iv

3 Thư viện tích hợp 20

3.1 Định địa chỉ tuyệt đối . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.2 Các hằng số và biến tích hợp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.3 Các hàm và chỉ thị của SG8V1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.3.1 Truy xuất cổng (sg8v1.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.3.2 Cấu hình stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.3.3 Các hàm chờ (delay.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.3.4 Các ngắt (interrupt.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

3.3.5 Bộ định giờ (timer.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.3.6 Bộ ghi và so sánh (Capture/Compare) (timer.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.3.7 Bộ điều chế độ rộng xung PWM (timer.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.3.8 Giao tiếp SPI (spi.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.3.9 Giao tiếp I2C (i2c.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.3.10 Giao tiếp ADC (adc.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.3.11 Giao tiếp UART (usart.h hoặc stdio.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.3.12 Truy xuất vùng FLASH (flash.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3.3.13 Các hàm chuỗi (string.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.3.14 Các hàm toán học (math.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

4 Môi trường phát triển tích hợp (IDE) IFast 42

4.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

4.2 Hướng dẫn cài đặt IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2.1 Cài đặt IFast trên Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2.2 Cài đặt trên Ubuntu/Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.3 Giao diện lập trình của IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4.4 Các tính năng chính của IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4.4.1 Quản lý Dự Án . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4.4.1.1 Tạo một dự án mới . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

4.4.1.2 Mở một dự án có sẵn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.4.1.3 Đóng dự án . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.4.1.4 Thêm tập tin mã nguồn vào trong dự án . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.4.2 Quản lý Tập Tin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.2.1 Mở một tập tin mã nguồn có sẵn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.2.2 Tạo mới một tập tin nguồn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.2.3 Thêm tập tin có sẵn vào dự án . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.2.4 Các thao tác trên tập tin nguồn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.5 Chức năng Tìm Kiếm, Thay Thế và Đi Tới . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.5.1 Find (Tìm Kiếm) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.5.2 Find in Files(Tìm Kiếm trong các tập tin) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Page 5: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast v

4.5.3 Find occurences(Tìm Kiếm sự xuất hiện) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

4.5.4 Replace (Thay Thế) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

4.5.5 Replace in Files (Thay Thế trong tập tin) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

4.5.6 Goto line (Đi Tới dòng) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.5.7 Goto Declaration/Implementation (Đi Tới Khai Báo/Thực thi) . . . . . . . . . . . . . . . . . . . . . . . 60

4.5.8 Goto Function (Đi Tới Hàm) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4.5.9 Swap Header/Source (Chuyển đổi qua lại giữa tập tin nguồn/tập tin khai báo) . . . . . . . . . . . . . . . 60

4.6 Chức năng biên dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4.7 Chức năng nạp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.8 Cấu hình trình biên dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4.8.1 Cấu hình biên dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.8.2 Cấu hình trình liên kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.8.3 Cấu hình đường dẫn của các trình biên dịch và trình thực thi . . . . . . . . . . . . . . . . . . . . . . . . 66

4.8.4 Các cấu hình khác . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

4.8.5 Cờ trình biên dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

4.9 Cấu hình chức năng tô màu cú pháp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

4.10 Cấu hình chức năng phím tắt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

5 Bootloader SG8V1 72

5.1 Cách viết chương trình bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.2 Quản lý vùng nhớ Flash của bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

5.2.1 Tổ chức vùng Flash của bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

5.2.2 Tổ chức các vùng nhớ trong 2 phần bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

5.2.3 Cách đổi địa chỉ bắt đầu phần thứ 2 của bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

5.3 Quản lý vùng nhớ Flash của user tương ứng với bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

6 Lưu ý khi sử dụng 81

7 Phụ lục 82

Page 6: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast vi

Danh sách hình vẽ

3.1 Sơ đồ bộ định giờ (timer0) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

3.2 Sơ đồ bộ định giờ (timer1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.3 Sơ đồ bộ định giờ (timer2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.4 Sơ đồ WDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.5 Sơ đồ khối ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3.6 Sơ đồ khối truyền UART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.7 Sơ đồ khối nhận UART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.1 Hộp thoại chào mừng của quá trình cài đặt IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

4.2 Giao ước giữa IFast và người dùng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

4.3 Hộp thoại chọn thành phần cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

4.4 Hộp thoại chọn đường dẫn cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4.5 Hộp thoại thể hiện quá trình cài đặt của IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.6 Hộp thoại thông báo quá trình cài đặt đã thành công. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

4.7 Quá trình cài IFast trên Ubuntu/Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4.8 Thông báo quá trình cài IFast trên Ubuntu/Debian thành công . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4.9 Giao diện IFast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

4.10 Giao diện tạo dự án mới . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

4.11 Giao diện thông tin dự án . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

4.12 Giao diện chức năng Find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4.13 Giao diện chức năng Find in Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

4.14 Hộp thoại Replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

4.15 Hộp thoại Replace in Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4.16 Công cụ Show Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

4.17 Các chức năng và tùy chọn của icprog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.18 Giao diện chức năng nạp (Build and Load) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.19 Giao diện công cụ Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

4.20 Giao diện cấu hình của công cụ Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

4.21 Hộp thoại cấu hình tính năng trình biên dịch C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.22 Hộp thoại cấu hình trình liên kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

Page 7: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast vii

4.23 Cấu hình đường dẫn của trình biên dịch/trình liên kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

4.24 Hộp thoại dùng cho việc cấu hình các chức năng khác . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

4.25 Hộp thoại cấu hình chức năng tô màu cú pháp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

4.26 Cấu hình chức năng phím tắt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

5.1 Hộp thư thoại ‘Other linker settings’ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.2 Sơ đồ tổ chức vùng nhớ Flash của bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

5.3 Sơ đồ hoạt động của bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Page 8: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast viii

Danh sách bảng

2.1 Các toán tử unary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.2 Các toán tử logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.3 Các toán tử bit và toán tử dịch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.4 Các toán tử logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.5 Các toán tử so sánh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.6 Các toán tử gán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.1 Danh sách các ngắt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.2 Các luật định dạng được dựa theo chuẩn ANSI-C cho hàm fprintf . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3.3 Biểu diễn số theo các luật định dạng trong hàm fprintf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Page 9: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82

Chương 1

Đặc tả hợp ngữ của SG8V1

1.1 Chỉ thị tiền xử lý

1.1.1 Chỉ thị tiền xử lý

Chỉ thị #include dùng để thêm một tập tin mã nguồn vào đầu chương trình. Khi dịch thì trình biện dịch hợp ngữ sẽ tự độngnối hai tập tin này lại. Cú pháp:

#include <ten_tap_tin.inc>

Ví dụ:

#include <sg8v1.inc>

1.1.2 Chỉ thị tiền xử lý #define

Chỉ thị #define dùng để khai báo một tên tương đương cho symbol hay giá trị. Chỉ thị này không sinh ra mã máy. Cú pháp:

#define ki_hieu bieu_thuc

Ví dụ:

#define hello_msg "Welcome to ICDREC"#define pi 3.14

1.1.3 Các chỉ thị tiền xử lý #if, #else, #endif

Các chỉ thị #if, #else và #endif quyết định đoạn mã nào sẽ được tham gia vào quá trình biên dịch. Nếu bieu_thuc_hang_socó giá trị khác 1 thì doan_ma_1 sẽ được dịch. Bằng 1 thì doan_ma_2 sẽ được dịch.

#if bieu_thuc_hang_sodoan_ma_1

[#elsedoan_ma_2]

#endif

Page 10: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 2 / 82

1.1.4 Các Chỉ thị tiền xử lý #ifdef và #ifndef

Các chỉ thị #ifdef và #ifndef có chức năng như chỉ thị #if nếu được sử dụng cùng từ khóa defined. Ví dụ như:

#ifdef dinh_danh#ifndef dinh_danh//tuong duong voi#if defined dinh_danh#if !defined dinh_danh

Cặp từ khóa #ifdef và #ifndef theo thứ tự chỉ yêu cầu trình biên dịch kiểm tra xem dinh_danh (định danh) đã được địnhnghĩa bằng chỉ thị #define hay chưa được định nghĩa.

1.2 Chỉ thị hợp ngữ

1.2.1 Chỉ thị EQU

Chỉ thị EQU dùng để khai báo một symbol (kí hiệu) với giá trị khởi tạo của nó. Khi biên dịch, trình biên dịch hợp ngữ sẽ thaysymbol này bằng giá trị tương ứng khai báo bằng chỉ thị EQU. Cú pháp:

ki_hieu EQU bieu_thuc

Ví dụ:

length EQU 20 ; length = 20width EQU 30 ; width = 30area EQU length*width ;area = 20x30 = 600

1.2.2 Chỉ thị RES

Chỉ thị RES dùng để giới hạn một vùng nhớ nhằm cấp cho symbol . Đơn vị của biểu thức bên phải được tính theo byte. Cú pháp:

ki_hieu RES bieu_thuc

Ví dụ:

length RES 2

1.2.3 Chỉ thị DB

Chỉ thị DB dùng để khai báo và đặt giá trị cho một byte trong vùng:

• RAM nếu có chỉ thị phía trên nó là loại chỉ thị đánh dấu là vùng nằm trong RAM.

• FLASH nếu có chỉ thị phía trước nó đánh dấu là vùng nằm trong FLASH.

Cú pháp:

ki_hieu DB bieu_thuc_1, bieu_thuc_2, ... , bieu_thuc_nki_hieu: DB bieu_thuc_1, bieu_thuc_2, ... , bieu_thuc_n

Ví dụ:

var DB 20 ; var = 20array DB 2,8,5 ; array + 1 = 2

; array + 2 = 8; array + 3 = 5

Page 11: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 3 / 82

1.2.4 Chỉ thị DW

Chỉ thị DW tương tự như chỉ thị DB nhưng dùng để khai báo và đặt giá trị cho một word . Lưu ý là một word trong SG8V1 có kíchthước tương đương 2 byte. Cú pháp:

ki_hieu DW bieu_thuc_1, bieu_thuc_2, ... , bieu_thuc_nki_hieu: DW bieu_thuc_1, bieu_thuc_2, ... , bieu_thuc_n

Ví dụ:

var DW 30 ; var = 30array DW 2,8,5; array + 1 = 2

; array + 3 = 8; array + 5 = 5

1.2.5 Chỉ thị DATA

Chỉ thị DATA dùng để đánh dấu vùng data. Bất kỳ symbol nào khai báo từ sau chỉ thị này tới trước chỉ thị vùng khác thì sẽ đềunằm trong vùng data. Vùng này dùng để chứa các biến đã được khởi tạo. Cú pháp:

ki_hieu DATA dia_chi_trong_RAM

Nếu người dùng không khai báo ki_hieu thì vùng đó sẽ có tên mặc định là .data. Nếu dia_chi_trong_RAM không được nêu rõthì trình biên dịch hợp ngữ sẽ tự thêm vào cho thích hợp.

Ví dụ:

initialized_data DATAvar DB 30

1.2.6 Chỉ thị UDATA

Chỉ thị UDATA dùng để đánh dấu vùng bss. Bất kỳ symbol nào khai báo từ sau chỉ thị này tới trước chỉ thị vùng khác thì sẽ đềunằm trong vùng bss. Vùng này dùng để chứa các biến chưa được khởi tạo. Cú pháp:

ki_hieu UDATA dia_chi_trong_RAM

Nếu người dùng không khai báo ki_hieu thì vùng đó sẽ có tên mặc định là .udata. Nếu dia_chi_trong_RAM không được nêurõ thì trình biên dịch hợp ngữ sẽ tự thêm vào cho thích hợp.

Ví dụ:

uninitialized_data UDATAvar RES 2

1.2.7 Chỉ thị UDATA_OVR

Chỉ thị UDATA_OVR dùng để đánh dấu vùng overlay register. Bất kỳ symbol nào khai báo từ sau chỉ thị này tới trước chỉ thịvùng khác thì sẽ đều nằm trong vùng overlay register. Vùng này dùng để chứa các biến chưa được khởi tạo. Điểm khác biệt sovới vùng bss là nếu nhiều vùng cùng tên được khai báo với chỉ thị UDATA_OVR thì các biến của các vùng này có thể dùng chungmột vùng nhớ. Cú pháp:

ki_hieu UDATA_OVR dia_chi_trong_RAM

Nếu người dùng không khai báo ki_hieu thì vùng đó sẽ có tên mặc định là .register. Nếu dia_chi_trong_RAM không đượcnêu rõ thì trình biên dịch hợp ngữ sẽ tự thêm vào cho thích hợp. Ví dụ:

Page 12: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 4 / 82

overlay_data UDATA_OVR 0x61 ; vung nay bat đau tu 0x61var1 RES 1 ; var1 co đia chi vung nho la 0x5c

var2 RES 1 ; var2 co đia chi vung nho la 0x5dvar3 RES 2 ; var3 co đia chi vung nho la 0x5evar4 RES 2 ; var4 co đia chi vung nho la 0x60

overlay_data UDATA_OVR 0x61 ; vung nay bat đau tu 0x61var5 RES 1 ; var5 dung chung vung nho voi var1var6 RES 3 ; var6 dung chung vung nho voi var2 va var3var7 RES 2 ; var7 dung chung vung nho voi var4

1.2.8 Chỉ thị ORG

Chỉ thị ORG dùng để đánh dấu địa chỉ tuyệt đối cho vùng mã phía sau nó. Tuyệt đối không được dùng chỉ thị này khi biên dịchnhiều file với linker để tạo mã máy. Cú pháp:

bieu_thuc ORG dia_chi_trong_RAM

1.2.9 Chỉ thị CODE

Chỉ thị CODE dùng để đánh dấu ví trị bắt đầu của một vùng mã của chương trình. Cú pháp:

ki_hieu CODE dia_chi_trong_RAM

Nếu dia_chi_trong_RAM không được nêu rõ thì trình biên dịch hợp ngữ sẽ tự thêm vào cho thích hợp. Hai vùng code trong cùngmột tập tin mã nguồn thì không được trùng tên.

1.2.10 Chỉ thị EXTERN

Chỉ thị EXTERN dùng để khai báo symbol theo kiểu toàn cục và dùng ở tập tin khác Cú pháp:

EXTERN bieu_thuc

Ví dụ:

...EXTERN global_function...lcall global_function...

1.2.11 Chỉ thị GLOBAL

Chỉ thị GLOBAL dùng để khai báo một symbol toàn cục. Symbol toàn cục này có thể dùng ở tập tin khác khi đã được khai báobằng từ khóa EXTERN đã đề cập ở mục trên. Cú pháp:

GLOBAL bieu_thuc

Ví dụ:

GLOBAL global_function

Page 13: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 5 / 82

1.2.12 Chỉ thị LOCAL

Chỉ thị LOCAL dùng để khai báo một symbol cục bộ. Một symbol cục bộ sẽ không ảnh hưởng tới giá trị của symbol toàn cục cócùng tên. Cú pháp:

bieu_tuong LOCAL bieu_thuc

Ví dụ:

LOCAL local_function

1.2.13 Chỉ thị END

Chỉ thị END dùng để đánh dấu vị trí kết thúc của một tập tin hợp ngữ. Cú pháp:

...

...END

1.3 Tập lệnh của SG8V1

Để hiểu rõ hơn về tập lệnh của vi xử lý SG8V1 vui lòng tham khảo SG8V1 datasheet.

1.4 Hướng dẫn hợp ngữ cho SG8V1

1.4.1 Biên dịch chương trình

Để biên dịch một chương trình hợp ngữ viết cho SG8V1 trên 1 tập tin, vui lòng sử dụng lệnh sau:

sg8-as input_file.asm -o output_file.osg8-ld output_file.o -o output_file.elfsg8-objcopy -O srec output_file.elf output_file.srec

Với input_file là tên của tập tin đầu vào chứa mã hợp ngữ và output_file là tên của tập tin đầu ra chứa mã máy

1.4.2 Chú thích

Để thêm chú thích cho chương trình, ta sử dụng dấu chấm phẩy ‘;’ đặt trước dòng chú thích. Chú thích sẽ không ảnh hưởng tớimã máy được sinh ra sau này vì trình biên dịch hợp ngữ sẽ bỏ qua tất cả các dòng bắt đầu bằng dấu chấm phẩy ‘;’. Cú pháp:

[ma_hop_ngu] ; chu_thich

Ví dụ:

var RES 1 ; khai bao bien var co kich thuoc 1 byte; chu thich co the co hay khong co ma hop ngu o truoc no

Page 14: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 6 / 82

1.4.3 Định danh

Một định danh là tên dùng để đặt cho biến, vùng dữ liệu, nhãn hay hàm. Định danh nhất định không được trùng với các chỉ thị vàchỉ thị tiền xử lý của chương trình. Ngoài các chữ cái, một định danh còn có thể bắt đầu bằng một trong các ký tự sau:

• ‘.’ (dấu chấm)

• ‘_’ (dấu gạch dưới)

Lưu ý: Định danh không được bắt đầu bằng số và chiều dài tối đa của định danh là 26 ký tự. Nếu định danh dài hơn26 ký tự thì trình biên dịch hợp ngữ sẽ tự động lấy 26 ký tự đầu tiên và bỏ qua toàn bộ các ký tự còn lại phía sau củađịnh danh.

1.4.4 Hằng số

Một chương trình hợp ngữ SG8V1 có thể có những kiểu hằng số sau:

• Hằng số đại số: Hằng số đại số sẽ được trình biên dịch hợp ngữ xem dưới dạng số bù 2 (tiếng anh: 2’s complement). Ngườidùng có thể viết hằng số dạng nay theo các hệ sau:

– Hệ thập phân: gồm tập hợp một hay nhiều số trong khoản 0->9 và số bắt đầu không phải là số 0.

– Hệ bát phân: gồm tập hợp một hay nhiều số trong khoản 0->7 và số bắt đầu phải là số 0.

– Hệ thập lục phân: gồm tập hợp một hay nhiều số trong khoản 0->9 và các chữ a->f với ký tự bắt đầu phải là ký tự 0x .

• Hằng số chuỗi: Hằng số chuỗi có thể là một hay nhiều ký tự chữ cái và số hợp thành.

1.4.5 Định nghĩa nhãn

Một nhãn bao gồm một định danh đặt trước dấu hai chấm ‘:’. Bằng việc định nghĩa nhãn, trình biên dịch hợp ngữ sẽ tự động gánvị trí trong mã nguồn cho nhãn khi biên dịch. Việc định nghĩa nhãn sẽ sinh ra lỗi nếu định danh dùng trong khai báo bị trùng vớiđịnh danh của nhãn khác.

Page 15: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 7 / 82

Chương 2

Đặc tả ngôn ngữ lập trình

Ngôn ngữ lập trình được hỗ trợ bởi trình biên dịch tích hợp trong IFast có cú pháp và các thành phần dựa vào tiêu chuẩn ANSI-C

2.1 Cấu trúc chương trình

Một chương trình được cấu thành thành bởi 4 thành phần sau đây:

• Chú thích (Comment)

• Chỉ thị tiền xử lý (Preprocessor Directive)

• Định nghĩa dữ liệu (Data Definition)

• Định nghĩa hàm (Function Definition)

Mỗi chương trình phải chứa một hàm main(), vì đó là nơi mà vi xử lý bắt đầu thực thi chương trình. Ngoài hàm main() ra thìchương trình cũng có thể có nhiều hàm khác tùy theo mục đích người lập trình và các hàm này sẽ được gọi thông qua hàm main()hoặc các hàm khác nó. Một chương trình có một hoặc nhiều tập tin nguồn, các tập tin này chính là tập tin đầu vào của trình biêndịch.

2.2 Các thành phần cơ bản

Một ngôn ngữ lập trình được cấu thành từ các thành phần cơ bản gọi là token. Một token có thể là từ khóa, định danh, hằng số,chuỗi ký tự, dấu chấm hay dấu phẩy.

2.2.1 Các từ khóa

Sau đây là danh sách các từ khóa được trình biên dịch sử dụng. Người dùng không được đặt tên biến/hàm trùng với các từ khóanày.

• Các kiểu: void,char,short,int,long,signed,unsigned,enum,struct,union.

• Các từ định tính (qualifiers) : const, volatile.

• Các lớp phạm vi (storage class): global, static, extern, typedef.

• Các câu lệnh (statements): break, case, continue, default, do, for, goto, if, return, switch, while.

Page 16: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 8 / 82

Trình biên dịch SG8V1 không có hỗ trợ kiểu bit nhưng người dùng có thể khai báo kiểu bit theo dạng sau :

typedef union {struct {unsigned char a:1;unsigned char b:1;unsigned char c:1;unsigned char d:1;

};} _bits_t;

volatile _bits_t _bits;

Kiểu _bits_t có các trường a, b, c, d tương ứng với bit 0 đến bit 3. Ta có thể tương tác với các bit này tương tự như sau:

_bits.a = 1;

2.2.2 Các định danh (Identifier)

Định danh là tên của các biến, các kiểu, các hàm, và các nhãn trong chương trình. Các định danh trong cùng một chương trìnhphải không được trùng nhau. Theo tiêu chuẩn của ANSI-C , trình biên dịch phân biệt định danh theo chữ hoa/ chữ thường. Vídụ, định danh abcd sẽ khác với định danh abcD. Kí tự đầu tiên của một định danh phải là một kí tự chữ cái hoặc dấu gạch dưới,không được là chữ số.

• Định danh: [_a-zA-Z][_0-9a-zA-Z]*

2.2.3 Hằng số

Bất kỳ chữ số, ký tự, chuỗi ký tự nào cũng có thể được dùng làm hằng số trong chương trình:

• Số nguyên:

– Hằng số hệ thập phân: 0 hay [1-9][0-9]*

– Hằng số hệ thập lục phân: 0x[0-9A-F]+

– Hằng số hệ nhị phân: 0b[0-1]+

• Kí tự: Hằng số kí tự là một kí tự thuộc bảng mã ASCII được đặt trong hai dấu ngoặc đơn (’ ’).

• Chuỗi kí tự: Là một dãy các ký tự được đặt trong hai dấu ngoặc kép (" ").

Ví dụ:

const char str[] = “ICDREC”;

2.3 Khai báo và kiểu dữ liệu

Mục này miêu tả phương thức khai báo và khởi tạo các biến, các hàm, và các kiểu dữ liệu:

Phương thức khai báo:

Cac_dac_ta_khai_bao danh_sach_doi_tuong_khai_bao-khoi_tao;

Trong đó

Cac_dac_ta_khai_bao:[lop_pham_vi] [thuoc_tinh_kieu_du_lieu] kieu_du_lieu

Page 17: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 9 / 82

danh_sach_doi_tuong_khai_bao-khoi_tao:doi_tuong_khai_bao-khoi_taohoacdoi_tuong_khai_bao-khoi_tao _1, doi_tuong_khai_bao-khoi_tao _2, ..., doi_tuong_khai_bao- ←↩

khoi_tao _n

Các đối tượng khai báo/khởi tạo có thể được khởi tạo hoặc không khởi tạo giá trị ban đầu cho nó:

doi_tuong_khai_bao//hoacdoi_tuong_khai_bao = gia_tri_khoi_tao

2.3.1 Các lớp phạm vi (storage class)

Các từ khóa trong lớp phạm vi (lop_pham_vi) là:

staticexterntypedef

Biến toàn cục (global) là biến được khai báo bên ngoài tất cả các hàm hay biến được khai báo với từ khóa extern. Những biến cònlại được xem như là biến cục bộ (local).

2.3.2 Kiểu dữ liệu và thuộc tính kiểu

Mỗi biến và hàm điều thuộc một kiểu dữ liệu nhất định. Các kiểu dữ liệu cơ bản như: void, (signed/unsigned) char, (signed/un-signed) int, (signed/unsigned) short, (signed/unsigned) long. Ngoài các kiểu dữ liệu cơ bản, ta có thể tạo nra các kiểu dữ liệuriêng cho mình bằng việc sử dụng các từ khóa như struct, union, enum, typedef. Ví dụ:

struct user{ char name[64]; char password[32];}typedef int* p_int;

Trong hai ví dụ trên, sau khi được khai báo thì user và p_int trở thành hai kiểu dữ liệu mới và ta có thể sử dụng chúng như cáckiểu dữ liệu cơ bản bên trên. Giới hạn của các kiểu dữ liệu dành cho số nguyên như char, int, short, long được thể hiện trong nhưsau:

‘char’ Kích thước 8 bit, giới hạn từ 0 đến 255 (kiểu unsigned) và từ -128 đến 127(kiểu signed)

‘int/short’ Kích thước 16 bit, giới hạn từ 0 đến 65535 (kiểu unsigned) và từ -32768 đến 32767(kiểu signed)

‘long’ Kích thước 32 bit, giới hạn từ 0 đến 4294967295 (kiểu unsigned) và từ -2147483648 đến 2147483647(kiểu signed)

Thuộc tính kiểu là phần mở rộng dùng để xác định điều kiện/hạn chế của kiểu dữ liệu. Có 3 thuộc tính được sử dụng như sau:

• Const Nếu một biến có được khai báo với thuộc tính const thì có nghĩa là nội dung của biến này sẽ không thể bị thay đổi.

• Volatile Một biến được định nghĩa với thuộc tính volatile thì nó sẽ không được tối ưu hóa bởi trình biên dịch và trình biên dịchsẽ tạo ra mã để đọc nội dung của nó từ bộ nhớ thay vì đọc giá trị từ một thanh ghi CPU khi có thể. Những đối tượng thườngđược gán định tính kiểu volatile là các ngắt hay những biến có thể bị thay đổi bởi chương trình khác.

• Restrict Đối tượng được chỉ đến bởi một con trỏ p có thuộc tính restrict thì bất kỳ tham chiếu nào đến thực thể này đều phảithông qua con trỏ p này. Như vậy thực thể này chỉ có thể có một con trỏ là p.

Page 18: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 10 / 82

2.3.3 Đối tượng khai báo

Các đối tượng được khai báo có 2 dạng:

doi_tuong* doi_tuong

Trong đó đối tượng có thể là

dinh_danhdinh_danh[bieu_thuc_hang_so]dinh_danh ( danh_sach_doi_so )dinh_danh ( danh_sach_kieu_doi_so )

Một đối tượng chỉ chứa dinh_danh thì nó có kiểu theo kiểu dữ liệu được khai báo trước nó. Nếu có dấu hoa thị (*) trước đối tượngthì kiểu đối tượng là con trỏ. Nếu theo sau đối tượng là dấu ngoặc vuông ([]) thì kiểu của đối tượng là kiểu mảng. Nếu sau đốitượng là ngoặc đơn thì đối tượng là kiểu hàm. Ví dụ:

const int a;restrict int *b;char c[6];int get_max(int a, int b);

Trong ví dụ trên thì những phần được in đậm chính là đối tượng khai báo, những phần được gạch dưới chính là thuộc tính kiểu,các phần còn lại chính là kiểu dữ liệu.

2.3.4 Khai báo cấu trúc

Khai báo kiểu cấu trúc được dùng để tạo ra một kiểu mới từ một hoặc nhiều kiểu đã định nghĩa.

struct dinh_danh { danh_sach_phan_tu }struct dinh_danh

Ví dụ:

struct a {int x;char y;

} var1;struct a var2;

2.3.5 Khai báo kiểu hợp nhất

Khai báo kiểu hợp nhất được dùng để tạo ra một kiểu mới từ một hoặc nhiều kiểu đã định nghĩa. Hệ thống sẽ không cấp phátvùng nhớ cho tới khi một biến được khai báo với kiểu kiểu hợp. Vùng nhớ của biến kiểu hợp nhất chính là vùng nhớ của phần tửlớn nhất của nó. Khi buộc phải lưu một phần tử có kích thước nhỏ hơn, biến kiểu hợp nhất sẽ chứa những vùng nhớ thừa. Tất cảcác phần tử đều được lưu trữ chung một vùng nhớ và cùng một địa chỉ bắt đầu. Giá trị được lưu trong biến kiểu hợp nhất sẽ bịchép đè lên mỗi khi có một giá trị mới được gán cho phần tử khác của biến. Cấu trúc để khai báo biến kiểu hợp nhất như sau:

union dinh_danh { danh_sach_phan_tu }union dinh_danh

Ví dụ:

union{

struct{

Page 19: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 11 / 82

unsigned int icon : 8;unsigned int color : 4;

} window;int screenval;

};

Trong ví dụ trên, kiểu hợp nhất có 2 phần tử là window và screenval. Window là một cấu trúc có 2 trường kiểu int nên kích thướtlà 4 byte. Screenval là một phần tử kiểu int có kích thướt 2 byte. Do đó, kích thướt của kiểu hợp nhất ở trên sẽ là 4 byte bằng vớikích thướt của window.

2.3.6 Khai báo enum

Enum là kiểu liệt kê. Khai báo enum dùng để liệt kê một tập hợp các hằng số nguyên được đặt tên. Một biến kiểu enum chứa mộttrong các giá trị được định nghĩa bởi kiểu đó.

enum dinh_danh { danh_sach_ten_hang_so }

Ví dụ:

enum direction{

UP,DOWN,RIGHT,LEFT

}

Trong ví dụ trên, nếu không chỉ rõ thì UP có giá trị bằng 0 và các hằng số tiếp theo sẽ có giá trị tăng dần đều với mỗi bước bằng1 đơn vị (DOWN bằng 1, RIGHT bằng 2, LEFT bằng 3).

2.3.7 Khai báo mảng

Khai báo mảng dùng để đặt tên mảng cũng như định ra số lượng và kiểu cho các thành phần của nó. Các biến kiểu mảng đượcxem như một con trỏ chỉ đến kiểu của các phần tử mảng. Định dạng của một mạng có 2 dạng sau:

dinh_danh[]dinh_danh[bieu_thuc_hang_so]

Vùng nhớ cấp cho kiểu mảng chính là vùng nhớ để chứa tất cả các phần tử của nó. Các phần tử của một mảng được lưu trữ tại cácvị trí bộ nhớ kề nhau và tăng dần từ phần tử đầu tiên đến phần tử cuối. Ví dụ:

int a_int[5];

2.3.8 Khai báo con trỏ

Khai báo con trỏ dùng để đặt tên biến con trỏ và kiểu của đối tượng mà biến con trỏ đó chỉ đến. Một biến kiểu con trỏ thực chấtchỉ chứa địa chỉ vùng nhớ của biến mà con trỏ đó chỉ tới.

* dinh_danh

Ví dụ:

char *p;const int *pi;

Lưu ý: Trình biên dịch SG8V1 không dùng typedef để định nghĩa kiểu hỗ trợ con trỏ hàm.

Page 20: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 12 / 82

2.3.9 Bộ khởi tạo

Bộ khởi tạo là một giá trị hoặc một chuỗi các giá trị được cấp phát cho biến đang được khai báo. Người dùng có thể khởi tạo giátrị của biến bằng cách cung cấp một bộ khởi tạo cho khai báo thể trong quá trình khai báo biến. Giá trị hoặc các giá trị của bộkhởi tạo sẽ được gán cho các biến theo thứ tự tương ứng.

• Khởi tạo biến kiểu số: Dùng biểu thức hằng số để khởi tạo giá trị cho biến kiểu số. Ví dụ

const int a = (3 * 1024);int *b = &a;

• Khởi tạo kiểu liệt kê: Bộ khởi tạo kiểu liệt kê dùng để khởi tạo các giá trị cho các trường/thành phần trong các biến kiểu dạngtổ hợp như kiểu mảng, kiểu cấu trúc, kiểu hợp nhất vv... Các giá trị trong bộ khởi tạo liệt kê được đặt trong cặp dấu ngoặc nhọn({}) và cách nhau bởi dấu phẩy.

Nếu số lượng các giá trị của bộ khởi tạo liệt kê nhỏ hơn số lượng các trường/thành phần trong biến thì các trường/thành phầnđầu tiên sẽ được khởi tạo giá trị, các trường/thành phần còn lại trong biến sẽ không được khởi tạo.

Nếu số lượng phần tử trong bộ khởi tạo kiểu liệt kê nhiều hơn số lượng trường/thành phần trong biến thì khi biên dịch sẽ phátsinh ra lỗi.

Nếu kích thướt mảng không được khai báo thì số lượng phần tử trong bộ khởi tạo sẽ xác định kích thướt của mảng.

int x[ ] = { 0, 1, 2 };struct list {int i, j;char m[2];

} y = {1, 2,{’a’, ’b’}

};

• Khởi tạo chuỗi Ta có thể khởi tạo một mảng ký tự bằng một chuỗi. Ví dụ như lệnh sau:

char s[ ] = "abc";

Khởi tạo biến s thành một mảng ký tự bốn phần tử với phần tử thứ tư là ký tự null được chèn tự động vào để đánh dấu vị trí kếtthúc chuỗi.

2.3.10 Dùng typedef để định nghĩa kiểu

Từ khóa typedef đóng vai trò như lớp phạm vi và khai báo thể để khai báo một kiểu mới. Ta có thể dùng khai báo typedef để tạora một tên ngắn gọn và ý nghĩa hơn cho các kiểu đã khai báo trước đó.

typedef struct club {char name[30];int size, year;

} GROUP;

typedef GROUP * PG;

Kiểu PG được khai báo như một con trỏ chỉ tới kiểu GROUP và kiểu GROUP này lại chính là từ khóa tương đương cho cấu trúcclub.

2.4 Các biểu thức

Một biểu thức là một dãy các toán tử và các toán hạng được dùng để thực thi các nhiệm vụ như: tính toán một giá trị, xác địnhmột đối tượng hoặc một hàm .v.v... Toán hạng bao gồm các hằng số, định danh, chuỗi, lệnh gọi hàm, biểu thức truy xuất phần tử,và các biểu thức phức tạp được tạo thành thông qua việc kết hợp các toán hạng với các toán tử hoặc các toán hạng đặt trong cácdấu hoặc đơn. Biểu thức cơ bản có thể là một định danh, hằng số, chuỗi kí tự hay một biểu thức đặt trong cặp dấu ngoặc đơn. Cáctoán tử được định nghĩa như sau:

Page 21: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 13 / 82

Toán tử miêu tả chú ý~ lấy bù (tương đương với NOT). toán hạng phải là kiểu nguyên.! Phép phủ định logic.

–Toán tử giảm (dùng cho cả tiền tố và hậu tố). Toán hạng phải làkiểu số nguyên hoặc kiểu con trỏ. Một con trỏ bị giảm sẽ chỉ đếnđối tượng trước đó.

++Toán tử tăng (dùng cho cả tiền tố và hậu tố). Toán hạng phải làkiểu số nguyên hoặc kiểu con trỏ. Một con trỏ được tăng sẽ chỉđến đối tượng tiếp theo.

* Toán tử gián tiếp truy xuất một giá trị một cách gián tiếp thôngqua một con trỏ

& Toán tử địa chỉ cung cấp địa chỉ toán hạng của nó Không được hỗ trợ địa chỉ củabiến kiểu bit

(type) Toán tử ép kiểu.

Bảng 2.1: Các toán tử unary

Toán tử miêu tả chú ý

+ Toán tử cộng. Mỗi toán hạng có thể là một số nguyên (i), kiểudấu chấm động (f) hoặc một con trỏ (p)

Không hỗ trợ cộng 2 con trỏ (p +p)

- Toán tử trừ. Một toán hạng có thể hoặc là một số nguyên (i), kiểudấu chấm động (f) hoặc một con trỏ (p).

Không hỗ trợ cộng 2 con trỏ (p -p)

* Toán tử nhân/ Toán tử chia% Toán tử chia lấy dư

Bảng 2.2: Các toán tử logic

Toán tử miêu tả chú ý& Toán tử AND.| Toán tử OR.ˆ Toán tử XOR.<< Toán tử dịch trái.>> Toán tử dịch phải.

Bảng 2.3: Các toán tử bit và toán tử dịch

Toán tử miêu tả chú ý&& Toán tử AND logic.|| Toán tử OR logic.

Bảng 2.4: Các toán tử logic

Toán tử miêu tả chú ý< Toán hạng đầu nhỏ hơn toán hạng thứ hai.> Toán hạng đầu lớn hơn toán hạng thứ hai.<= Toán hạng đầu nhỏ hơn hoặc bằng với toán hạng thứ hai.>= Toán hạng đầu lớn hơn hoặc bằng với toán hạng thứ hai.== Toán hạng đầu bằng với toán hạng thứ hai.!= Toán hạng đầu không bằng với toán hạng thứ hai.

Bảng 2.5: Các toán tử so sánh

Page 22: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 14 / 82

Toán tử miêu tả chú ý= Toán hạng đầu nhỏ hơn toán hạng thứ hai.

x= Toán tử này gán giá trị của toán hạng bên phải cho toán hạng bêntrái.

Bảng 2.6: Các toán tử gán

2.5 Tập lệnh

Các lệnh quyết định dòng thực thi của chương trình. Tập lệnh gồm có lệnh null, lệnh biểu thức, lệnh break, lệnh khối, lệnh break,lệnh continue,các lệnh vòng lập, các lệnh rẻ nhánh, lệnh return và lệnh dùng để chèn hợp ngữ vào chương trình. Phần này sẽ miêutả tập lệnh được trình biên dịch hỗ trợ.

2.5.1 Lệnh Null “;”

Lệnh null là một lệnh chỉ có đấu chấm phẩy ’;’ nó có thể xuất hiện bất cứ nơi nào mà một lệnh được phép xuất hiện. Lệnh này sẽbị bỏ qua và không biên dịch. Lệnh null được viết như sau:

;

2.5.2 Lệnh biểu thức

Khi một lệnh biểu thức được thi hành, thì kết quả của biểu thức đó sẽ được tính toán.

biểu thức;

Ví dụ:

y = ( f( x ) + 3 ); /* A function-call expression */

Trong lệnh này, biểu thức gọi hàm f(x), lấy giá trị trả về của hàm này cộng 3 và sau đó gán kết quả cuối cùng vào biến y.

2.5.3 Lệnh break

Lệnh break kết thúc việc thực thi các vòng lặp do, for, while hoặc cấu trúc switch trực tiếp chứa nó. Quyền điều khiển sẽ đượcđưa về cho lệnh tiếp theo gần vòng lặp/cấu trúc này nhất.

break;

2.5.4 Lệnh khối

Một lệnh khối thường dùng làm phần thân của một lệnh khác, chẳng hạn như lệnh if, do, for, while. Một lệnh ghép được cấuthành từ một hay nhiều câu lệnh được đặt giữ một cặp dấu ngoặc nhọn ({ }).

{ danh_sach_lenh }

2.5.5 Lệnh continue

Lệnh continue chuyển quyền điều khiển cho lần duyệt tiếp của vòng lặp do, for hoặc while trực tiếp chứa nó, và bỏ qua các lệnhcòn lại trong phần thân của vòng lặp này.

continue;

Page 23: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 15 / 82

2.5.6 Lệnh if

Lệnh if điều khiểu việc rẻ nhánh có điều kiện. Phần thân của một lệnh if được thi hành nếu giá trị của biểu thức khác không. Cúpháp của lệnh if có 2 dạng.

if ( bieu_thuc ) lenhhoacif ( bieu_thuc ) lenh else lenh

2.5.7 Lệnh else if

if ( bieu_thuc_1 ) lenh_1else if ( bieu_thuc_2 ) lenh_2...else if ( bieu_thuc_n-1 ) lenh_n-1else lenh_n

Nếu bieu_thuc_1 đúng thì thực hiện lenh_1 và thoát khỏi cấu trúc if Ngược lại nếu bieu_thuc_2 đúng thì thực hiện lenh_2 vàthoát khỏi cấu trúc if . . . Ngược lại nếu bieu_thuc_n-1 đúng thì thực hiện lenh_n-1 và thoát khỏi cấu trúc if Ngược lại thì thựchiện lenh_n.

2.5.8 Lệnh switch và case

Lệnh switch và case cho phép người dùng điều khiển các hoạt động rẻ nhánh và có điều kiện phức tạp. Lệnh switch chuyển quyềnđiều khiển đến một lệnh trong phần thân của nó.

switch ( bieu_thuc )

nhan: (neu co)case bieu_thuc_hang_so_1 : danh_sach_lenh_1case bieu_thuc_hang_so_2 : danh_sach_lenh_2...case bieu_thuc_hang_so_n-1 : danh_sach_lenh_n-1default: danh_sach_lenh_n

Quyền điều khiển sẽ được chuyển đến các lệnh case có giá trị bằng với giá trị của biểu thức trong lệnh switch. Lệnh switch cóthể chứa vô số lệnh case nhưng các hằng số của các lệnh case này không được phép trùng nhau. Lệnh switch sẽ so sánh giátrị của biểu thức trong nó với giá trị của từng lệnh case cho tới khi không còn lệnh case nào để so sánh nữa thì nó sẽ thi hànhdanh_sach_lenh_n trong lệnh default. Khi thi hành danh_sach_lenh_i, nếu trong danh_sach_lenh_i không có lệnh break thì sẽtiếp tục thực hiện các danh_sach_lenh_i+1 cho đến danh_sach_lenh_n hoặc gặp lệnh break trong các khối lệnh đó thì kết thúchàm switch.

2.5.9 Lệnh do-while

Lệnh do-while dùng để lặp lại một lệnh hoặc một lệnh khối cho đến khi biểu thức điều kiện không đúng nữa.

do lenh while ( bieu_thuc );

(bieu_thuc) trong lệnh do-while được tính toán sau khi vòng lặp được thực thi. Cho nên, vòng lặp do-while luôn được thi hành ítnhất một lần.

Page 24: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 16 / 82

2.5.10 Lệnh while

Lệnh while dùng lặp để lại một lệnh hoặc một lệnh khối khi biểu thức (bieu_thuc) điều kiện thỏa.

while ( bieu_thuc ) lenh;

Lệnh while kết thúc khi có một lệnh break, goto, hay return trong phần thân của lệnh này được thi hành. Sử dụng lệnh continuetrong vòng lặp while để ngưng lần lặp hiện tại và chuyển tới lần lặp tiếp theo.

2.5.11 Lệnh for

Lệnh for dùng để lặp lại một lệnh hoặc một lệnh khối với một số lần cụ thể. Phần thân của lệnh for không được thi hành hoặc thihành nhiều lần cho đến khi điền kiện lặp (không bắt buộc) không thỏa nữa. Ta có thể dùng các biểu thức trong lệnh for để khởitạo và thay đổi giá trị của biểu thức trong suốt quá trình thực thi của lệnh for.

for ( bieu_thuc_khoi_tao; bieu_thuc_đieu_khien;bieu_thuc_vong_lap )lenh

Lệnh for đang thực thi sẽ kết thúc khi thi hành một lệnh break, goto, hay return trong phần thân của nó. Sử dụng lệnh continuetrong vòng lặp for để ngưng lần lặp hiện tại và chuyển tới lần lặp tiếp theo.

2.5.12 Lệnh goto và các lệnh có nhãn

Lệnh goto chuyển điểu khiển đến một nhãn. Nhãn này phải nằm trong cùng một hàm với lệnh goto và phải được đính kèm vớimột lệnh nào đó.

nhan:lenh_co_nhan...goto nhan;

lenh_co_nhan chỉ có ý nghĩa với lệnh goto. Lệnh này sẽ được thực thi như lệnh bình thường.

2.5.13 Lệnh return

Lệnh return kết thúc việc thực thi một hàm và trả lại quyền điều khiển cho hàm gọi nó. Lệnh return cũng trả về một giá trị chohàm gọi nó.

return [bieu_thuc] ;

Giá trị của biểu thức (nếu có) được trả về cho hàm gọi nó. Nếu lệnh return không có biểu thức phía sau nó thì giá trị trả về sẽkhông được xác định. Giá trị của biểu thức bieu_thuc (nếu có) sẽ được chuyển đổi thành kiểu trả về của hàm.

2.5.14 Lệnh __asm, __endasm

Các lệnh này cho phép chèn trực tiếp các lệnh hợp ngữ vào các chương trình nguồn của mình. Người dùng có thể sử dụng cácbiến toàn cục cho các lệnh hợp ngữ này.

__asmCac_lenh_hop_ngu

__endasm;

Trình biên dịch hiểu các lệnh hợp ngữ chuẩn cũng như các lệnh riêng của SG8V1( tham khảo datasheet SG8V1 để biết thêm chitiết).

Page 25: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 17 / 82

2.6 Hàm

Hàm là đơn vị cơ bản cấu thành một chương trình. Hàm thường được thiết kế để thi hành một nhiệm vụ cụ thể, và tên của hàmthường phản ánh nhiệm vụ của hàm đó. Hàm phải được định nghĩa và khai báo trong chương trình. Phần này miêu tả cách khaibáo, định nghĩa một hàm và cách gọi các hàm.

2.6.1 Định nghĩa hàm

Định nghĩa hàm dùng để đặt tên, định kiểu trả về của hàm, kiểu và số lượng các tham số. Định nghĩa hàm cũng bao gồm phầnthân của hàm với các biến cục bộ được khái báo bên trong hàm và các lệnh mà hàm đó thi hành.

kieu_du_lieu doi_tuong_khai_bao_ham lenh_khoi

Trong đó:

• doi_tuong_khai_bao_ham là:

dinh_danh ( danh_sach_tham_so)

• danh_sach_tham_so có thể là:

nullkhai_bao_tham_sokhai_bao_tham_so_1, khai_bao_tham_so_2, ... ,khai_bao_tham_so_n

dinh_danh_kieu và khai_bao_the_ham được dùng để chỉ ra kiểu trả về và tên của hàm. khai_bao_the_ham là sự kết hợp củamột định danh dùng để nêu tên của hàm và cặp dấu ngoặc tròn ngay sau định danh này.

• Lệnh khối chính là phần thân của hàm. Lệnh này chứa các khai báo biến cục bộ, những nhân tố được khai báo bên ngoài vàcác lệnh mà nó phải thực thi.

2.6.2 Khai báo hàm

Khai báo hàm đứng trước định nghĩa hàm. Nó dùng để nêu tên, kiểu trả về, lớp phạm vi, và các thuộc tính khác của một hàm.Theo nguyên mẫu, khai báo hàm cũng phải thiết lập các kiểu và các định danh cho các tham số của hàm.

kieu_du_lieu doi_tuong_ khai_bao_ham;

Trong đó:

• doi_tuong_ khai_bao_ham là:

dinh_danh( danh_sach_tham_so)

• danh_sach_tham_so là:

nullkhai_bao_tham_sokhai_bao_tham_so_1, khai_bao_tham_so_2, ... ,khai_bao_tham_so_n

Theo nguyên mẫu, khai báo hàm có định dạng tương tự như định nghĩa hàm, chỉ khác nhau là khai báo hàm kết thúc bởi dấuchấm phẩy ngay sau dấu ngoặc đơn đóng. Ví dụ khai báo hàm theo nguyên mẫu:

int add( int a, int b );

Ví dụ khai báo hàm khuyết (không theo nguyên mẫu):

int add( int, int );

Page 26: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 18 / 82

2.6.3 Lệnh gọi hàm

Lệnh gọi hàm là một biểu thức dùng để truyền quyền điều khiển, các tham số đến một hàm. Nó có dạng:

ten_ham ( danh_sach_bieu_thuc )

Trong đó, danh_sach_bieu_thuc là một danh sách các biểu thức (tách bởi dấu phẩy). Các giá trị của biểu thức là các tham sốtruyền đến hàm. Nếu hàm không trả về một giá trị thì hàm đó nên được khai báo như hàm trả về kiểu void.

2.6.4 Truyền tham số

Một tham số có thể là bất kì giá trị nào có kiểu cơ bản, cấu trúc, hợp nhất, hoặc con trỏ. Có hai cách truyền tham số:

• Truyền tham trị: lúc này trình biên dịch sẽ sao chép giá trị của tham số vào một vùng nhớ tạm để hàm dùng. Hàm không biếtvị trí vùng nhớ thực tế của tham số truyền vào. Vì thế hàm có thể dùng bản sao này mà không ảnh hưởng đến bản gốc của nó.

• Truyền tham biến: truyền tham biến chính là truyền các con trỏ cho phép hàm truy xuất biến một cách gián tiếp. Do một contrỏ chỉ đến một biến mà con trỏ chứa địa chỉ của biến này nên hàm có thể dùng địa chỉ này để truy xuất giá trị của biến. Thamsố con trỏ cho phép một hàm truy xuất các mảng, mặc dù các mảng không thể truyền trực tiếp như một tham số vào hàm.

2.7 Chú thích

Một chú thích có thể xuất hiện bất cứ nơi nào trong một tập tin. Chú thích là các ký tự giữa hai dấu /* và */ cũng như các ký tựngay sau dấu (//) đến khi kết thúc dòng. Chú thích sẽ bị bỏ qua và không được biên dịch.

/* chu thich... */

hoaclenh; // chu thich

2.8 Chỉ thị tiền tiền xử lý

2.8.1 Chỉ thị #define

Chỉ thị #define dùng để cung cấp tên cho một hằng số hoặc định nghĩa một macro trong chương trình. Định dạng của chỉ thịnày như sau:

#define dinh_danh chuoi_ki_tuhoac#define dinh_danh( danh_sach_dinh_danh ) chuoi_ki_tu

Chỉ thị #define thay thế dinh_danh xuất hiện sau chỉ thị này bằng chuoi_ki_tu. Ngoài ra nếu định danh trong chỉ thị nàyđược khai báo như một hàm (tức có kèm theo tham số đặt trong danh_sách_dinh_danh) thì ngoài việc thay dinh_danh bằngchuoi_ki_tu, chỉ thị này còn thay thế giá trị của từng tham số vào dinh_danh tương ứng của nó trong chuỗi bất kỳ. Một chỉ thị #define mà không có chuoi_ki_tu sẽ loại bỏ toàn bộ những dinh_danh xuất hiện sau chỉ thị này ra khỏi tập tin nguồn. Tuy nhiên,dinh_danh vẫn được xem như đã được định nghĩa và có thể được sử dụng trong các chỉ thị #if và #ifdef.

2.8.2 Các chỉ thị #if, #else, #endif

Các chỉ thị #if, #else và #endif quyết định đoạn mã nào sẽ được tham gia vào quá trình biên dịch. Nếu bieu_thuc_hang_socó giá trị khác 0 thì doan_ma_1 sẽ được dịch. Bằng không thì doan_ma_2 sẽ được dịch.

Page 27: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 19 / 82

#if bieu_thuc_hang_sodoan_ma_1

[#elsedoan_ma_2]

#endif

2.8.3 Các chỉ thị #ifdef và #ifndef

Các chỉ thị #ifdef và #ifndef có chức năng như chỉ thị #if nếu được sử dụng cùng từ khóa defined. Ví dụ như:

#ifdef dinh_danh#ifndef dinh_danh//tuong duong voi#if defined dinh_danh#if !defined dinh_danh

Cặp từ khóa #ifdef và #ifndef theo thứ tự chỉ yêu cầu trình biên dịch kiểm tra xem dinh_danh đã được định nghĩa bằng chỉthị #define hay chưa được định nghĩa.

Page 28: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 20 / 82

Chương 3

Thư viện tích hợp

3.1 Định địa chỉ tuyệt đối

Định địa chỉ tuyệt đối cung cấp cách đọc và ghi dữ liệu cổng, cách tương tác với các chức năng thanh ghi đặt biệt (SFR) nhưthanh ghi timer, capture .v.v... Ví dụ:

__sfr __at(0x03) STATUS;

Khai báo một biến có tên là STATUS (là một thanh ghi chức năng đặt biệt), tương ứng với thanh ghi tại địa chỉ 0x03. Một khiđược khai báo thì nó có thể gán trực tiếp giá trị vào thanh ghi này.

STATUS = 0x34;

Ngoài phương pháp định địa chỉ tuyệt đối, người dùng có thể dùng kiểu hợp nhất để truy xuất giá trị kiểu bit của một thanh ghi.Ví dụ:

#define STATUS_ADDR 0x0003typedef union {

struct {unsigned char C:1;unsigned char DC:1;unsigned char Z:1;unsigned char NOT_PD:1;unsigned char NOT_TO:1;unsigned char RP0:1;unsigned char RP1:1;unsigned char IRP:1;

};} __STATUS_bits_t;

volatile __STATUS_bits_t __at(STATUS_ADDR) STATUS_bits;...STATUS_bits.C = 1;

3.2 Các hằng số và biến tích hợp

Tất cả các thanh ghi chức năng đặc biệt (SFR) cũng như các cổng và các chân theo datasheet SG8V1 được khai báo trong tập tinsg8v1.h. Như vậy, người dùng có thể dễ dàng sử dụng chúng trực tiếp.

char *p = PORTA;

Page 29: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 21 / 82

Đối với tám thanh ghi PORTX và DIRX mà X là A, B, C hoặc D thì người dùng có thể sử dụng các chân của nó theo ví dụ sauđây:

PORTA_bits.PINi = 0; // i is between 0 and 7.

Tham khảo datasheet SG8V1 cho biết thêm các chi tiết về các thanh ghi và các chân. Mỗi ngắt (interrupt) có một nhãn tươngứng.

nguồn ngắt Sự kiện gây ra Nhãn ngắt

Timers Thanh ghi timer bị trànINT_TIMER0 INT_TIMER1INT_TIMER2 INT_TIMER3

Ngắt ngoài Giá trị các chân ngắt ngoại vi thay đổiINT_EXT0 INT_EXT1 INT_EXT2INT_EXT3

CC Compare hoặc Capture INT_CC

UART1 Truyền dữ liệu khi bộ đệm dữ liệu rỗngNhận dữ liệu khi bộ đệm dữ liệu đầy

INT_TBE1 INT_RDA1

UART2 Truyền dữ liệu khi bộ đệm dữ liệu rỗngNhận dữ liệu khi bộ đệm dữ liệu đầy

INT_TBE2 INT_RDA2

UART3 Truyền dữ liệu khi bộ đệm dữ liệu rỗngNhận dữ liệu khi bộ đệm dữ liệu đầy

INT_TBE3 INT_RDA3

I2C Truyền hoặc nhận dữ liệu Xung đột bus dữliệu

INT_I2C INT_BUSCOL

SPI Truyền hoặc nhận dữ liệu INT_SPI

ADC Chuyển đổi tín hiệu từ AC sang DC. INT_ADC

Bảng 3.1: Danh sách các ngắt

3.3 Các hàm và chỉ thị của SG8V1

3.3.1 Truy xuất cổng (sg8v1.h)

Ghi một số nguyên 8 bit đến cổng X với X là A, B, C, hoặc D.

void output_X(unsigned char);

Đọc một số nguyên 8 bit từ cổng X với X là A, B, C, hoặc D.

unsigned char input_X();

Thiết lập trạng thái mức cao cho các chân của cổng X.

void output_high(PIN_Xi);

Thiết lập trạng thái mức thấp cho các chân của cổng X.

void output_low(PIN_Xi);

Đảo trạng thái các chân của cổng X.

void output_toggle(PIN_Xi);

Page 30: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 22 / 82

Cấu hình hướng xuất/nhập của cổng X.

void set_tris_X(unsigned char);

Lấy giá trị cấu hình hướng xuất/nhập của cổng X.

unsigned char get_tris_X();

Lưu ý: Để đọc hoặc ghi một cổng X., các hàm này (Xoutput_X, input_X) sửa đổi các thành ghi định hướng tươngứng. Ví dụ, trong hàm input_B(), phải có một lệnh TRISB = 0xFF; hơn nữa, khi đọc hay thay đổi giá trị của mộtchân, những hàm này sẽ thay đổi bit tương ứng trong thanh ghi định hướng. Các nhãn chân (PIN_Xi) được khai báothành các hằng số tích hợp.

3.3.2 Cấu hình stack

• Chỉ thị tiền xử lý #use stack cho phép người dùng thiết lập kích thước của vùng stack của SG8V1.

#use stack size;

• Nếu người dùng không sử dụng chỉ thị này, thì kích thước vùng mặc định của stack là 256 byte.

3.3.3 Các hàm chờ (delay.h)

• Chỉ thị tiền xử lý #use delay:

#use delay(clock=speed);

cho trình biên dịch biết tốc độ của bộ xử lý và cho phép người dùng sử dụng hàm tích hợp: delay_ms(). Hằng số speed nằmtrong khoảng từ 1.000.000 đến 14.000.000 ( 1MHz đến 14MHz).

• Chờ một khoảng thời gian cụ thể

void delay_ms(unsigned int time);

Time được chỉ định với đơn vị miligiây. Cách hoạt động của hàm này là thực thi một số lệnh hợp ngữ để tạo ra độ trễ tương ứng.

• Chờ theo chu kỳ

void delay_5cycles(unsigned char count);void delay_10cycles(unsigned char count);void delay_100cycles(unsigned char count);void delay_1kcycles(unsigned char count);void delay_10kcycles(unsigned char count);void delay_100kcycles(unsigned char count);

Các hàm này tạo mã để thực thi số lượng cụ thể các lệnh hợp ngữ nhằm tạo ra độ trễ ứng với số chu kỳ được chỉ định (1-255).Một chu kỳ thực thi lệnh hợp ngữ bằng với chu kỳ dao động.

Lưu ý: Độ trễ có thể bị sai lệch (dài hơn) so với yêu cầu nếu một ngắt được phục vụ trong suốt quá trình chờ. Nóicách khác, thời gian dành cho các hàm phục vụ ngắt (ISR) sẽ không được tính vào thời gian chờ.

Page 31: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 23 / 82

3.3.4 Các ngắt (interrupt.h)

• Cho phép hay vô hiệu hóa quyền ưu tiên của ngắt

#enable_int_priority//or#disable_int_priority

Theo mặc định thì quyền ưu tiên của ngắt sẽ được bật.

• Cho phép hay vô hiệu hóa các cấp độ ngắt

void enable_interrupt_level(level);//andvoid disable_interrupt_level(level);

Tham số level có thể là một trong những giá trị sau: GLOBAL, HIGH, LOW, EXTERNAL, hoặc PERIPHERAL. Chỉ dùng hằngsố HIGH/LOW khi quyền ưu tiên ngắt được bật (xem mục trên), ngược lại thì chỉ được phép dùng các hằng số EXTERNAL/PERIPHERAL/GLOBAL khi quyền ưu tiên ngắt bị vô hiệu hóa. Các giá trị của tham số level có ý nghĩa sau:

– HIGH: Cho phép/vô hiệu hóa cấp ngắt có độ ưu tiên cao.

– LOW: Cho phép/vô hiệu hóa cấp ngắt có độ ưu tiên thấp.

– EXTERNAL: Cho phép/vô hiệu hóa các ngắt ngoài.

– PERIPHERAL: Cho phép/vô hiệu hóa các ngắt ngoại vi.

– GLOBAL: Cho phép/vô hiệu hóa toàn bộ.

• Cho phép hay vô hiệu hóa các ngắt Ngoài việc cho phép/vô hiệu hóa các ngắt theo loại, ta còn có thể cho phép/vô hiệu hóatừng ngắt riêng rẽ mà ta chọn bằng cách dùng hai hàm sau:

void enable_interrupts(interrupts);//andvoid disable_interrupts(interrupts);

Tham số interrupts có thể chứa một hay hợp (phép OR) của các nhãn ngắt sau:

– INT_TIMER0

– INT_TIMER1

– INT_TIMER2

– INT_TIMER3

– INT_EXT0

– INT_EXT1

– INT_EXT2

– INT_EXT3

– INT_TBE1

– INT_RDA1

– INT_TBE2

– INT_RDA2

– INT_TBE3

– INT_RDA3

– INT_SPI

– INT_CC

– INT_I2C

– INT_BUSCOL

Page 32: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 24 / 82

– INT_ADC

• Định nghĩa hàm con phục vụ ngắt (ISR):

#int_xxxxhandler_definition

Chỉ thị này đứng ngay trước một định nghĩa hàm; và hàm này được gọi bất kỳ lúc nào ngắt #int_xxxx xảy ra. #int_xxxxchỉ có một trong các chỉ dẫn sau đây:

– #int_timer0

– #int_timer1

– #int_timer2

– #int_timer3

– #int_ext0

– #int_ext1

– #int_ext2

– #int_ext3

– #int_tbe1

– #int_rda1

– #int_tbe2

– #int_rda2

– #int_tbe3

– #int_rda3

– #int_spi

– #int_cc

– #int_i2c

– #int_buscol

– #int_adc

Ví dụ khi cần khai báo một hàm để xử lý ngắt của timer0, ta khai báo như sau:

#int_timer0void int_timer0_handler() {statements

}

Trình biên dịch sẽ tạo ra mã để nhảy đến hàm này khi ngắt tương ứng xảy ra. Hàm con này sẽ tự động xóa cờ ngắt khi đã phụcvụ ngắt. Để ngăn không cho xóa cờ ngắt thì phải thêm noclear sau #int_xxxx

#int_timer0 noclear

Một chỉ thị ngắt mà sau nó là từ khóa high hoặc low giúp trình biên dịch biết được độ ưu tiên của ngắt này là cao hay thấptương ứng. Mặc định, nếu không khai báo các chỉ thị này thì quyền ưu tiên là cao (high).

#int_timer0 highvoid int_timer0_handler() {statements

}

• Thiết lập quyền ưu tiên giữa các ngắt

#enable_int_priority#int_priority interrupt_list

Page 33: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 25 / 82

Tham số interrupt_list là một danh sách chứa một hoặc nhiều ngắt được tách nhau bởi dấu phẩy và được sắp xếp theothứ tự ưu tiên từ cao đến thấp (từ trái qua phải). Chỉ thị này phân quyền ưu tiên một cách trực quan và trái ngược với tùychọn high|low trong định nghĩa ISR phía trên. Nó vẫn hoạt động mặc dù quyền ưu tiên ngắt bị vô hiệu hóa do chỉ thị #disable_int_priority, tức là theo mặc định tất cả các ngắt có quyền ưu tiên cao.

Khi độ ưu tiên ngắt được bật thông qua chỉ thị #enable_int_priority và interrupt_list chứa các ngắt có độ ưu tiên caolẫn thấp, thì interrupt_list được xem như hai danh sách riêng biệt, một cho các ngắt có độ ưu tiên cao và một cho cácngắt có độ ưu tiên thấp.

Ví dụ, các ngắt INT_TIMER0 và INT_TIMER1 có độ ưu tiên cao còn các ngắt INT_ADC và INT_SPI có độ ưu tiên thấpthì sau khi khai báo chỉ thị sau:

#int_priority INT_TIMER0,INT_ADC, INT_SPI, INT_TIMER1

Nếu 4 ngắt xảy ra đồng thời thì hệ thống sẽ ưu tiên xử lý các các ngắt có độ ưu tiên cao (INT_TIMER0 và INT_TIMER1)trước các ngắt có độ ưu tiên thấp (INT_ADC và INT_SPI). Trong các ngắt có cùng độ ưu tiên thì ngắt nào được liệt kê trướctrong chỉ thị #int_priority sẽ được ưu tiên xử lý trước. Kết quả là hệ thống sẽ xử lý bốn ngắt trên theo thứ tự sau:

INT_TIMER0 → INT_TIMER1 → INT_ADC → INT_SPI.

• Xóa các cờ ngắt

void clear_interrupt_flags(interrupts);

Tham số interrupts là bit được tính bằng cách hợp (phép OR) các nhãn ngắt. Xem danh sách các nhãn ngắt ở các mục phíatrên để biết thêm chi tiết.

• Chọn sự kiện ngắt theo cạnh lên hoặc theo cạnh xuống đối với các ngắt ngoài.

void ext_int_edge(external_int, ext_type);

Trong đó:

– external_int là một trong bốn ngắt ngoài, và

– ext_type là H_TO_L hoặc L_TO_H.

• khai báo hàm handler interrupt chung cho từng vector:

void func_name (void) __interrupt vector

vector: chỉ có một trong 2 giá trị VECTOR_HIGH và VECTOR_LOW.

– VECTOR_HIGH: là chỉ thị đặt hàm func_name trong vector ngắt high.

– VECTOR_LOW: là chỉ thị đặt hàm func_name trong vector ngắt low.

Ví dụ:

void isr_hight (void) __interrupt VECTOR_HIGH{

if ((IF2 & 0x02) && (IE2 & 0x02)){

U1RXInterrupt();IF2 &= (~0x02);

}else if ((IF2 & 0x20) && (IE2 & 0x20)){

U3RXInterrupt();IF2 &= (~0x20);

}}void U1RXInterrupt (void)

Page 34: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 26 / 82

{...;

void U3RXInterrupt (void){...;

}void isr_low (void) __interrupt VECTOR_LOW{

if ((IF1 & 0x20) && (IE1 & 0x20)){

int_ext1_handler();IF1 &= (~0x20);

}

}void int_ext1_handler (void){...;

}...;

Lưu ý: Trong một project có hàm được khai báo với thuộc tính VECTOR_LOW và VECTOR_HIGH như ví dụ trênthì project phải đảm bảo chỉ có duy nhất một hàm được khai báo với các thuộc tính VECTOR_LOW hoặc VECTOR_HIGH, và toàn bộ project này không được dùng tất cả chỉ thị ngắt như #int_xxxx, #enable_int_priority.v.v...

• Không cho phép các cấp độ ngắt xảy ra trong một đoạn chương trình

unsigend char lock_interrupts();void unlock_interrupt(unsigned char flags);

Hàm lock_interrupts là hàm vô hiệu hóa toàn bộ các ngắt, thiết lập giá trị 0 cho thanh ghi GIC. Giá trị trả về của hàmlà giá trị của GIC trước khi thiết lập giá trị 0. Hàm unlock_interrupts là hàm thiết lập lại trạnh thái GIC trước khi dùnghàm lock_interrupts. code{flags} là giá trị trạng thái GIC trước khi dùng lock_interrupts.

Khi các hàm được gọi trong chương trình chính (là các hàm không được gọi trong tất cả handler ngắt) muốn thay đổi các biếntoàn cục này, để tránh xung đột dữ liệu, chương trình chính phải khóa ngắt toàn cục thông qua hai hàm lock_interruptsvà unlock_interrupts. Ví dụ: Biến timer được tăng trong handler ngắt timer 3, người dùng muốn khóa toàn bộ ngắtkhi thay đổi biến timer thì phải viết như sau:

volatile int timer;#int_timer3void handler_timer3(){...++timer;...

}void main (){unsigned char flags;...flags = lock_interrupts();timer = 0;unlock_interrupts(flags);...

}

Lưu ý: Người dùng phải thận trọng khi sử dụng 2 hàm lock_interrupts và unlock_interrupt, phải đảmbảo 2 hàm này luôn đi theo từng cặp. Nếu không chương trình sẽ chạy sai.

Page 35: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 27 / 82

Lưu ý: Tất cả các biến toàn cục sử dụng trong cả các hàm interrupt (handler interrupt) lẫn hàm main và các hàmkhác trong project buộc phải khai báo với từ khóa volatile. Nếu không trình biên dịch sẽ biên dịch sai ở một sốtrường hợp. Tất cả các hàm điều khiển vô hiệu hóa và cho phép ngắt được trình bày phía trên không được dùng trongtất cả các handler ngắt.

3.3.5 Bộ định giờ (timer.h)

Hình 3.1: Sơ đồ bộ định giờ (timer0)

• Cấu hình timer0 (tức là RTCC):

void setup_timer0(mode);

Với mode là một trong những hằng số hay hợp (phép OR) các hằng số thuộc nhóm một và nhóm hai:

– RTCC_INTERNAL, RTCC_EXT_L_TO_H, RTCC_EXT_H_TO_L.

– RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256,(cấu hình tiền tỉ lệ, ví dụ: 1:2, 1:4,...)

– RTCC_OFF (vô hiệu hóa timer0).

Ví dụ:

setup_timer0(RTCC_DIV_2 | RTCC_EXT_L_TO_H);

• Thiết lập giá trị đếm của timer0:

void set_timer0(unsigned char n);

• Lấy giá trị đếm của timer0:

unsigned char get_timer0();

Page 36: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 28 / 82

Hình 3.2: Sơ đồ bộ định giờ (timer1)

• Cấu hình timer1:

void setup_timer1(mode);

Với mode là một trong những hằng số hay hợp (phép OR) các hằng số thuộc hai nhóm khác nhau:

– T1_OFF, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC

– T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8 (cấu hình tiền tỉ lệ. Ví dụ: 1:1, 1:2,...).

Ví dụ:

setup_timer1(T1_INTERNAL | T1_DIV_BY_4);

• Thiết lập giá trị đếm của timer1:

void set_timer1(unsigned int n);

• Lấy giá trị đếm của timer1:

unsigned int get_timer1();

Hình 3.3: Sơ đồ bộ định giờ (timer2)

• Cấu hình timer2:

void setup_timer2(mode, period, postscale);

Với:

Page 37: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 29 / 82

– mode là một trong những hằng số sau: T2_OFF, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16, T2_DIV_BY_64. Hàm nàyvô hiệu hóa hay khởi động timer2 với một tỉ lệ chia xung (clock divisor) nhất định.

– Period là một số nguyên 10-bit được dùng để quyết định khi nào giá trị của clock phải được đưa về 0. Giá trị của nó (0-1023)được gán cho thanh ghi PR2.

– postscale là một trong các hằng số sau: T2_POST_SCALER_BY_n với n nằm trong khoảng 1 và 16.

• Thiết lập giá trị của timer2:

void set_timer2(unsigned int n);

• Lấy giá trị của timer2:

unsigned int get_timer2();

Các hàm setup_timer3, set_timer3, get_timer3 dùng để điều khiển timer3 cũng được định nghĩa giống như những hàm dànhcho timer2.

Hình 3.4: Sơ đồ WDT

• Cấu hình WDT:

void setup_wdt(mode);

Với mode là một trong số những hằng số sau: WDT_ON, WDT_OFF, WDT_DIV_2, WDT_DIV_4, WDT_DIV_8, WDT_DIV_16,WDT_DIV_32, WDT_DIV_64, WDT_DIV_128, WDT_DIV_256. Hàm này khởi động/vô hiệu hóa WDT hoặc gán cho nó mộtgiá trị tiền tỉ lệ nào đó.

• Xóa WDT (nhằm tránh việc khởi động lại watchdog):

void clr_wdt();

3.3.6 Bộ ghi và so sánh (Capture/Compare) (timer.h)

• Cấu hình CC:

void setup_cc(mode);

Với mode là một trong tám hằng số số được chia làm hai nhóm sau:

• Chế độ ghi:

– CC_CAPTURE_FE: ghi khi gặp cạnh đi xuống (CCMOD[2:0] = 000),

– CC_CAPTURE_RE: ghi khi gặp cạnh đi lên (CCMOD[2:0] = 001),

– CC_CAPTURE_DIV_4: ghi sau mỗi bốn nhịp (CCMOD[2:0] = 010),

Page 38: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 30 / 82

– CC_CAPTURE_DIV_16: ghi sau mỗi 16 nhịp (CCMOD[2:0] = 011);

Chế độ so sánh:

– CC_COMPARE_SET_ON_MATCH: xuất ra tín hiệu cao khi so sánh (CCMOD[2:0] = 100),

– CC_COMPARE_CLR_ON_MATCH: xuất ra tín hiệu thấp khi so sánh (CCMOD[2:0] = 101),

– CC_COMPARE_INT: bật ngắt khi so sánh (CCMOD[2:0] = 110),

– CC_COMPARE_TOGGLE: đảo trạng thái tín hiệu đầu ra khi so sánh (CCMOD[2:0] = 111).

Hàm này cấu hình chân RD6 thành chân xuất (nhập) khi sử dụng chế độ so sánh (chế độ ghi) bằng cách gán bit DIRD[6] bằngmột (gán bằng 0).

• Khởi động/vô hiệu hóa CC:

void cc(state);

Với state có thể dùng một trong hai giá trị CC_ON hay CC_OFF. Theo đó, hàm này gán hằng số CCEN thành 0 hay 1 tươngứng.

• Thiết lập giá trị thanh ghi CC:

void set_cc_value(unsigned int n);

• Lấy giá trị thanh ghi CC:

unsigned int get_cc_value();

3.3.7 Bộ điều chế độ rộng xung PWM (timer.h)

Vi xử lý SG8V1 có hai bộ PWM (PWM1 and PWM2) với các tính năng tương tự nhau. Để cấu hình chúng thì người dùng cầndùng các hàm sau:

• Cấu hình PWM1:

void setup_pwm1(mode, duty);

Với

– mode có thể là T2_CLOCK hay T3_CLOCK ,

– duty là một số nguyên 0-bit (từ 0 tới 1023) dùng để quyết định tải của PWM1.

Hàm này sẽ chọn clock của PWM1 từ timer2 hay timer3 bằng cách gán bằng một hay xóa bit PWM1TS. Để cấu hình đượctải của PWM1, hàm này sẽ gán duty vào PWM1RH:PWM1RL và thiết lập hướng xuất của PORTC[2] bằng cách cấu hình bitDIRC[2].

• Khởi động/vô hiệu hóa PWM1:

void pwm1(state);

Với state có thể là PWM_ON hay PWM_OFF. Hàm này thay đổi bit PWM1ON.

• Cấu hình PWM2:

void setup_pwm2(mode, duty);

Với

– mode có thể là T2_CLOCK hay T3_CLOCK ,

– duty là một số nguyên 0-bit (từ 0 tới 1023) dùng để quyết định tải của PWM2.

Page 39: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 31 / 82

Hàm này sẽ chọn clock của PWM2 từ timer2 hay timer3 bằng cách gán bằng một hay gán bằng không bit PWM2TS. Để cấuhình được tải của PWM2, hàm này sẽ gán duty vào PWM2RH:PWM2RL và thiết lập hướng xuất của PORTC[3] bằng cách cấuhình bit DIRC[3].

• Khởi động/vô hiệu hóa PWM2:

void pwm2(state);

Với state có thể là PWM_ON hay PWM_OFF. Hàm này thay đổi bit PWM2ON.

3.3.8 Giao tiếp SPI (spi.h)

• Người dùng có thể cấu hình SPI như sau:

void spi_setup(mode);

Trong đó, mode có thể là một trong những hằng số sau, hay hợp (phép OR) của chúng:

– Thiết lập thiết bị: SPI_MASTER, SPI_SLAVE, SPI_DISABLED;– o Chọn cực của xung giữ nhịp (CPOL-Clock POLarity): SPI_HIGH, SPI_LOW;– o Chọn cạnh xung clock: SPI_FALLING_EDGE, SPI_RISING_EDGE.– Thiết lập chế độ SPI:

* Nếu một thiết bị được thiết lập như thiết bị master, chế độ SPI mode là một trong những hằng số sau: SPI_CLK_DIV_4,SPI_CLK_DIV_16, SPI_CLK_DIV_64, SPI_CLK_T2;

* Nếu một thiết bị được thiết lập như là thiết bị slave, chế độ SPI có thể là một trong những hằng số sau: ENABLE_SS,DISABLE_SS.

Lưu ý: Hàm này sẽ phải thiết lập bit SPICON bằng một.

Ví dụ:

spi_setup(SPI_MASTER | SPI_HIGH | SPI_CLK_DIV_64);//orspi_setup(SPI_SLAVE | SPI_HIGH | ENABLE_SS);

• Gởi một byte thông qua SPI:

void spi_write(unsigned char value);

Hàm này sẽ chiếm 8 chu kỳ máy. Khi ở chế độ master: hàm spi_write sẽ tự động truyền dữ liệu từ buffer sang cho thiết bịslave. Khi ở chế độ slave: dữ liệu hàm spi_write ghi vào buffer sẽ phải chờ lệnh truyền dữ liệu từ thiết bị master mới được phéptruyền.

• Nhận một byte thông qua SPI:

unsigned char spi_read();

Hàm này chiếm một chu kỳ máy và trả về giá trị được đọc bởi SPI. Tham số out_data không phải là tham số bắt buộc. Ví dụnhư:

in_data = spi_read(out_data);// does the same thing asspi_write(out_data);in_data = spi_read();

Nếu chưa nhận được dữ liệu thì spi_read sẽ tiếp tục chờ.

• Kiểm tra xem dữ liệu đã sẵn sàng hay chưa:

bool spi_data_is_in();

Hàm này sẽ trả về giá trị true nếu dữ liệu được nhận thông qua SPI.

Page 40: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 32 / 82

3.3.9 Giao tiếp I2C (i2c.h)

• Để sử dụng giao tiếp I2C và các hàm liên quan thì chỉ thị sau phải được sử dụng:

#use i2c(options)

Trong đó options là danh sách các cấu hình được phân cách bởi các dấu phẩy (,):

– Cấu hình thiết bị dưới dạng thiết bị master hay slave: I2C_MASTER, I2C_SLAVE;– Thiết lập tốc độ I2C: I2C_STANDARD, I2C_FAST;– speed=n, cấu hình tốc độ I2C trong chế độ master ở tốc độ n (Kb/s), n phải nhỏ hơn hoặc bằng 400Kb/s. Nên nhớ rằng tốc

độ chuẩn tương ứng của chế độ I2C_STANDARD và I2C_FAST là 100 và 400Kb/s;– Sử dụng phần cứng cho I2C: FORCE_HW,– Thiết lập chế độ địa chỉ:

* ADDR_7BITS: sử dụng chế độ địa chỉ 7-bit,

* ADDR_10BITS: sử dụng chế độ địa chỉ 10-bit,

* ADDR_7BITS_INT: sử dụng chế độ địa chỉ 7-bit với bit Start và Stop được gài ngắt,

* ADDR_10BITS_INT: sử dụng chế độ địa chỉ 10-bit với bit Start và Stop được gài ngắt;– address=n: nêu địa chỉ thông qua giá trị n, trong chế độ slave;

Ví dụ:

#use i2c(I2C_MASTER, I2C_FAST, ADDR_7BITS)// hay#use i2c(I2C_SLAVE, ADDR_7BITS, address=0xa0)

Lưu ý: Bit I2CON phải được cấu hình nếu chỉ thị (#use i2c) được sử dụng.Các tùy chọn địa chỉ như addr_7bits,addr_10bits, addr_7bits_int, addr_10bits_int chỉ có thể được dùng chỉ khi bit I2C được cấu hình thành slave.

• Khởi động I2C trong chế độ master:

void i2c_start();

Hàm này phát động một điều kiện khởi động và clock được thiết lập ở mức thấp cho tới khi hàm i2c_write được gọi. Nếu mộthàm i2c_start khác được gọi trong cùng một hàm trước khi hàm i2c_stop được sử dụng thì một lệnh khởi động lại đặt biệt sẽđược phát động.

• Ngưng I2C trong chế độ master:

void i2c_stop();

Hàm này phát động một điều kiện ngưng cho I2C.

• Nhận một byte thông qua giao thức I2C:

unsigned char i2c_read(unsigned char ack);

Tham số tùy chọn ack theo mặc định là 1. Trong chế độ master thì hàm này sẽ tạo ra xung còn trong chế độ slave thì nó sẽ chờxung.

• Gởi một byte thông qua giao thức I2C:

unsigned char i2c_write(unsigned char data);

Giá trị trả về là một byte đại diện cho unsigned char ack (0 là ack, 1 là không ack) hay một xung đột trong chế độ đa-master(giá trị trả về bằng 2). Giá trị trả về chẳng có ý nghĩa gì nếu I2C đang trong chế độ slave. Trong chế độ master thì hàm này sẽtạo ra một xung với dữ liệu. Còn trong chế độ slave thì nó sẽ chờ một xung từ master. Bit bên phải của lần ghi đâu tiền kể từlúc bắt đầu sẽ quyết định hướng truyền dữ liệu (0 nghĩa là từ master đến slave)

• Kiểm tra xem liệu phần cứng đã nhận một byte trong bộ đệm hay chưa:

unsigned char i2c_poll();

Khi giá trị trả về bằng 1 thì lệnh i2c_read sẽ lập tức trả về byte mà nó nhận được.

Page 41: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 33 / 82

3.3.10 Giao tiếp ADC (adc.h)

Hình 3.5: Sơ đồ khối ADC

• Hàm cấu hình ADC

void adc_open(unsigned char channel, unsigned char fosc);

Trong đó channel là tham số cấu hình kênh cho khối ADC, tham số này này chỉ có một trong các giá trị sau đây:

– ADC_CHN_1: cấu hình kênh 1 cho khối ADC (VIN1)

– ADC_CHN_2: cấu hình kênh 2 cho khối ADC (VIN2)

– ADC_CHN_3: cấu hình kênh 3 cho khối ADC (VIN3)

– ADC_CHN_4: cấu hình kênh 4 cho khối ADC (VIN4)

fosc là tham số cấu hình bộ chia tần số hoạt động của khối ADC, tham số này chỉ có một trong các giá trị sau đây:

– ADC_FOSC_1: cấu hình không chia tần số cho khối ADC, tức là tần số hoạt động của khối ADC bằng fosc

– ADC_FOSC_2: cấu hình chia 2 tần số cho khối ADC, tức là tần số hoạt động của khối ADC bằng với fosc chia 2

– ADC_FOSC_3: cấu hình chia 4 tần số cho khối ADC, tức là tần số hoạt động của khối ADC bằng với fosc chia 4

• Hàm chọn kênh ADC

void adc_setchannel(unsigned char channel);

Page 42: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 34 / 82

Hàm adc_setchannel là hàm cấu hình kênh cho khối ADC. Trong đó, tham số channel tương tự như tham số channel của hàmadc_open

• Hàm chuyển đổi từ AC sang DC

void adc_conv(void);

Hàm adc_conv điền khiển khối ADC bắt đẩu chuyển đổi tín hiệu AC sang DC.

• Hàm kiểm tra trạng thái của ADC

unsigned char adc_busy(void);

Đây là hàm kiểm tra trạng thái khối ADC, nếu hàm này trả về giá trị 0 có nghĩa là khối ADC đang chuyển đổi tín hiệu, nếuhàm này trả về giá trị 1 có nghĩa là khối ADC đã chuyển đổi tín hiệu xong hoặc đang trạng thái rỗi (ready).

• Hàm đọc kết quả của ADC

unsigned char adc_read(void);

Sau khi khối chuyển đổi tín hiệu này xong, người lập trình có thể dùng hàm này để đọc giá trị tín DC của khối ADC thông quahàm này.

• Hàm không cho phép ADC hoạt động

void adc_close(void);

Hàm này dùng để không cho phép khối ADC hoạt động. Sau khi dùng hàm này, nếu người lập trình muốn khởi động lại khốiADC thì dùng hàm adc_open

3.3.11 Giao tiếp UART (usart.h hoặc stdio.h)

Hình 3.6: Sơ đồ khối truyền UART

Page 43: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 35 / 82

Hình 3.7: Sơ đồ khối nhận UART

• Để có thể sử dụng UART (tức RS232) cũng như các hàm liên quan thì người dùng phải sử dụng chỉ thị sau:

#use rs232(options)

Chỉ thị này cho trình biên dịch biết tốc độ xung (baud rate) và các chân dùng cho việc xuất/nhập tuần tự. Chỉ thị này cho phépsử dụng các hàm tích hợp như getc, putc, puts, fgetc, fputc, fputs, fprintf và printf (xem bên dưới); và chỉthị này chỉ có tác dụng cho tới khi gặp một chỉ thị RS232 khác dùng chung cổng UART với nó. Nên nhớ là vì các hàm getc,putc, puts và printf không cho phép người dùng chọn cổng UART nào để xuất/nhập dữ liệu nên sẽ dùng cổng UARTđược khai báo trong chỉ thị #use rs232(options) được khai báo gần nó nhất. Chỉ thị #use delay phải xuất hiện trướckhi chỉ thị #use rs232(options) có thể được sử dụng. Tham số options là một danh sách các tùy chọn sau (được phâncách bởi dấu phẩy):

– baud=x: gán tốc độc xung bằng x,

– uart=n: chọn UART n,

– parity=x: với x có thể là một trong các giá trị: N, E hay O,

Ví dụ như nếu muốn dùng cổng UART 2 với tốc độ 115200 thì ta khai báo:

#use rs232 (uart=2,baud=115200,parity=N)

Lưu ý: #use rs232(options) chỉ được khai báo trong tập tin ‘.c’ chứa hàm main () hoặc tập tin ‘.h’được dùng #include trong tập tin ‘.c’ chứa hàm main() đó. Ngoài ra, người dùng có thể khai báo một hoặcnhiều #use rs232(options) trong một tập tin ‘.c’ hoặc ‘.h’ nhưng trình biên chỉ chọn các #use rs232(options) sau cùng để cấu hình cho các uart. Ví dụ, trong tập tin ‘.c’ khai báo #use rs232(options) nhưsau:

#use rs232 (uart=1,baud=115200,parity=N)#use rs232 (uart=2,baud=9600,parity=N)#use rs232 (uart=3,baud=19200,parity=N)...#use rs232 (uart=2,baud=115200,parity=E)#use rs232 (uart=3,baud=9600,parity=O)Sau khi bien dich tap tin nay, trinh bien dich se chon nhu sau:

Page 44: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 36 / 82

#use rs232 (uart=1,baud=115200,parity=N) cau hinh cho UART 1#use rs232 (uart=2,baud=115200,parity=E) cau hinh cho UART 2#use rs232 (uart=3,baud=9600,parity=O) cau hinh cho UART 2

• Hàm cấu hình lại uart:

void uart1_open(unsigned char bHigh, unsigned char bLow, unsigned char config);void uart2_open(unsigned char bHigh, unsigned char bLow, unsigned char config);void uart3_open(unsigned char bHigh, unsigned char bLow, unsigned char config);

Các hàm này dùng cấu hình lại các UART1, UART2, UART3. Trong đó:

– bHigh: là đối số chứa giá trị cấu hình thanh ghi UxBRH

– bLow: là đối số chứa giá trị cấu hình thanh ghi UxBRL

– config: là cấu hình parity. Giá trị của nó chỉ có một trong các giá trị NON_PARITY, EVEN_PARITY và ODD_PARITY.

Khi dùng các hàm này, người dùng phải tự tính giá trị bHigh, bLow tương ứng với tốc độ baud cần thiết lập(đọc datasheetSG8V1 để biết thêm chi tiết)). Ngoài ra, người dùng có thể dùng code BAUD(value) để trình biên dịch tự tính giá trị bHigh,bLow theo tốc độ baud value cần thiết lập. Khi dùng BAUD(value), người dùng phải định nghĩa xung cấp CPU SG8V1thông qua CPU_CLK. Ví dụ:

#include <usart.h>...#define CPU_CLK 16000000...uart1_open(BAUD(9600), NON_PARITY);...uart2_open(BAUD(38400), EVEN_PARITY);...uart3_open(BAUD(57600), ODD_PARITY);...

• Nhận một ký tự (stdio.h):

char getc();

Hàm này chờ một ký tự thông qua chân nhận và trả về ký tự này. Người dùng có thể kiểm tra lỗi của hàm này thông qua biếnrs232_errors. Biến này có thể có trong các dữ liệu sau đây:

– ERR_NON: dữ liệu nhận thành công.

– ERR_FRAMING: dữ liệu lỗi bị ‘framimg error’.

– ERR_OVERRUN: dữ liệu lỗi bị ‘overrun error’.

– ERR_PARITY: dữ liệu bị lỗi ‘parity error’

• Nhận một chuỗi ký tự từ cổng UART (stdio.h):

char * gets(char * str);

Hàm này chờ các ký tự thông qua chân nhận và lưu các ký tự này vào str cho đến khi nhận một kí tự ‘LF end line’ hoặckí tự ‘EOF -end of file’ hoặc kí tự lỗi thì thoát ra. Người dùng có thể kiểm tra kí tự lỗi của hàm này thông qua biếnrs232_errors.

• Kiểm tra hoàn thành nhận một kí tự của UART (stdio.h):

char * khbit();

Nếu hàm này trả về giá trị ‘1’ thì UART đã hoàn thành nhận một ký tự, Ngược lại, giá trị ‘0’, thì UART đạng nhận một ký tự,

• Truyền một ký tự (stdio.h):

Page 45: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 37 / 82

void putc(char c);

Hàm này gởi một ký tự thông qua chân gởi.

• Gởi một chuỗi ký tự (stdio.h):

void puts(char *c);

Hàm này gởi một mảng ký tự (kết thúc bằng ký tự NULL) bằng cách liên tục gọi hàm putc. Các hàm nêu trên chỉ có thể dùngvới cổng UART được khai báo trong chỉ thị #use rs232(options). Để có thể giao tiếp với các cổng UART còn lại, ngườidùng có thể sử dụng hàm mở rộng của UART sau khi đã cấu hình cổng UART mới với hàm uartXopen.

Lưu ý: khi dùng các hàm putc, getc, puts, gets thì phải khai báo #use rs232(options) để cấu hìnhUART cho các hàm này. Khi trong một tập tin, có khai báo nhiều #use rs232(options) thì trình biên dịch sẽchọn khai báo #use rs232(options) để cấu hình UART cho các hàm này.

• Nhận một ký tự với cổng UART bất kỳ do người dùng chọn (stdio.h):

char fgetc(FILE * stream);

Hàm này chờ một ký tự thông qua chân nhận và trả về ký tự này. Tham số stream sẽ chỉ định cổng UART nào sẽ đảm nhậncông tác truyền dữ liệu, nó chỉ có một trong các giá trị sau đây:

– STREAM_UART_1

– STREAM_UART_2

– STREAM_UART_3

Nếu hàm được thực thi thành công thì ký tự đọc được từ chân nhận sẽ được trả về, bằng không thì hằng số EOF sẽ được trả về.

• Nhận một chuỗi ký tự với cổng UART bất kỳ do người dùng chọn (stdio.h):

char * fgets(char *str, unsigned char num, FILE *stream);

Hàm này chờ các ký tự thông qua chân nhận và lưu các ký tự này vào str cho đến khi nhận kí tự thứ num -1 hoặc một kí tự ‘LFend line’ hoặc kí tự ‘EOF -end of file’ hoặc kí tự lỗi thì thoát ra. Người dùng có thể kiểm tra kí tự lỗi của hàm nàythông qua biến rs232_errors.

• Kiểm tra hoàn thành nhận một kí tự với cổng UART bất kỳ do người dùng chọn (stdio.h):

char * fkhbit(FILE *stream);

Nếu hàm này trả về giá trị 1 thì UART đã hoàn thành nhận một ký tự, Ngược lại, giá trị 0, thì UART đang nhận một ký tự.

• Truyền một ký tự với cổng UART bất kỳ do người dùng chọn:

void fputc(char c, FILE * stream);

Hàm này gởi một ký tự thông qua chân gởi. Nếu hàm được thực thi thành công thì một giá trị không-âm sẽ được trả về, bằngkhông thì hằng số EOF sẽ được trả về.

• Truyền một chuỗi ký tự với cổng UART bất kỳ do người dùng chọn (stdio.h):

char fputs(char *c, FILE * stream);

Hàm này gởi một mảng ký tự (kết thúc bằng ký tự null) bằng cách liên tục gọi hàm putc. Nếu hàm được thực thi thành công thìmột giá trị không-âm sẽ được trả về, bằng không thì hằng số EOF sẽ được trả về.

• Xuất một chuỗi được định dạng thông qua cổng UART định sẵn (stdio.h):

void printf(string);//orvoid printf(format_string, values...);

Page 46: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 38 / 82

Hàm này tính toán chuỗi được xuất ra từ tham số format_string và các giá trị tương ứng và gởi chuỗi này qua chân xuất. Luậtđịnh dạng được dựa theo chuẩn ANSI-C (đối với hàm printf) với một số kiểu biến bị hạn chế. Ký tự % được dùng trong thamsố format_string để chỉ ra một giá trị biến cần phải được định dạng và xuất ra. Luật định dạng có cấu trúc tổng %nt với:

– n là một số tùy ý từ 1 đến 9 nhằm nêu ra số lượng ký tự cần được xuất ra.– t là kiểu và có thể nhận một trong các giá trị sau:

c Characterb Bitu Unsigned intd Sign ints StringLu Long unsigned intLd Long signed intx Hex int (lower case)X Hex int (upper case)Lx Hex long int (lower case)LX Hex long int (upper case)f float or double

Bảng 3.2: Các luật định dạng được dựa theo chuẩn ANSI-C cho hàm fprintf

format value=0x12 value=0xFE%b 10010 11111110%03u 018 254%u 18 254%2u 18 * (undefine)%d 18 -2%x 12 fe%X 12 FE%4X 0012 00FE

Bảng 3.3: Biểu diễn số theo các luật định dạng trong hàm fprintf

• Xuất một chuỗi được định dạng thông qua cổng UART do người dùng chọn (stdio.h):

void fprintf(FILE * stream, string);//orvoid fprintf(FILE * stream, format_string, values...);

Hàm này tính toán chuỗi được xuất ra từ tham số format_string và các giá trị tương ứng và gởi chuỗi này qua chân xuất. Luậtđịnh dạng được dựa theo chuẩn ANSI-C (đối với hàm fprintf ) với một số kiểu biến bị hạn chế. Ký tự % được dùng trong thamsố format_string để chỉ ra một giá trị biến cần phải được định dạng và xuất ra. Luật định dạng có cấu trúc tổng %nt với:

– n là một số tùy ý từ 1 đến 9 nhằm nêu ra số lượng ký tự cần được xuất ra.– t là kiểu và có thể nhận một trong các giá trị giá trị trình bày trong bảng Biểu diễn số theo các luật định dạng trong hàm

fprintf

• Xuất một chuỗi được định dạng thông qua buffer do người dùng chọn (stdio.h):

void sprintf(char * buffer, string);//orvoid sprintf(char * buffer, format_string, values...);

Hàm này tính toán chuỗi được xuất ra từ tham số format_string và các giá trị tương ứng và gởi chuỗi này qua chân xuất. Luậtđịnh dạng được dựa theo chuẩn ANSI-C (đối với hàm sprintf ) với một số kiểu biến bị hạn chế. Ký tự % được dùng trong thamsố format_string để chỉ ra một giá trị biến cần phải được định dạng và xuất ra. Luật định dạng có cấu trúc tổng %nt với:

Page 47: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 39 / 82

– n là một số tùy ý từ 1 đến 9 nhằm nêu ra số lượng ký tự cần được xuất ra.

– t là kiểu và có thể nhận một trong các giá trị trình bày trong bảng Biểu diễn số theo các luật định dạng trong hàm fprintf

3.3.12 Truy xuất vùng FLASH (flash.h)

• SG8V1 chia vùng FLASH thành 2 vùng:

– Vùng chứa chương trình: 64Kx16.

– Vùng chứa thông tin người sử dụng: 2Kx16.

• Hàm cấu hình chế độ truy xuất FLASH

void config_access_flash (unsigned char conf)

Trong đó conf là tham số cấu hình truy xuất FLASH, tham số này chỉ có một trong các giá trị sau đây:

– ACCESS_PROGRAM: cấu hình truy xuất vùng Flash chứa chương trình Người dùng. Sau khi sử dụng hàm này với giá trịcấu hình ACCESS_PROGRAM, tất cả hàm truy xuất vùng FLASH bên dưới sẽ tác động vào vùng Flash chứa chương trìnhngười dùng (64Kx16)

– ACCESS_DATA: cấu hình truy xuất vùng Flash chứa thông tin người sử dụng. Sau khi sử dụng hàm này với giá trị cấuhình ACCESS_DATA, tất cảhàm truy xuất vùng FLASH bên dưới sẽ tác động vào vùng Flash chứa thông tin người sử dụng(2Kx16)

• Hàm ghi khối dữ liệu vào FLASH

void write_block_flash(unsigned int* raddr, unsigned int* faddr, unsigned long size);

Trong đó:

– raddr là tham số địa chỉ vùng RAM chứa dữ liệu cần ghi vào vùng Flash, địa chỉ này là địa chỉ theo byte

– faddr là tham số địa chỉ vùng FLASH cần ghi dữ liệu, địa chỉ này là địa chỉ theo byte và phải chia hết cho 2.

– size là tham số kích thước dữ liệu cần ghi vào, tham số này được tính theo byte.

Hàm này sẽ ghi một khối dữ liệu trong vùng RAM có địa chỉ bắt đầu là raddr với kích thước là size vào vùng FLASH có địachỉ bắt đầu là faddr.

• Hàm đọc khối dữ liệu từ FLASH

void read_block_flash(unsigned int* raddr, unsigned int* faddr, unsigned long size);

Trong đó:

– raddr là tham số địa chỉ vùng RAM chứa dữ liệu cần đọc từ vùng Flash, địa chỉ này là địa chỉ theo byte

– faddr là tham số địa chỉ vùng FLASH cần đọc dữ liệu ra, địa chỉ này là địa chỉ theo byte và phải chia hết cho 2.

– size là tham số kích thước dữ liệu cần đọc ra, tham số này được tính theo byte.

Hàm này sẽ đọc một khối dữ liệu FLASH có địa chỉ bắt đầu là faddr với kích thước là size, và lưu toàn bộ khối dữ liệu đó vàovùng RAM có địa chỉ bắt đầu là raddr.

• Hàm ghi một trang dữ liệu vào FLASH

void write_page_flash(unsigned int* raddr, unsigned int* faddr);

Trong đó:

– raddr là tham số địa chỉ vùng RAM chứa dữ liệu cần ghi vào vùng Flash, địa chỉ này là địa chỉ theo byte.

– faddr là tham số địa chỉ vùng FLASH cần ghi dữ liệu, địa chỉ này là địa chỉ theo byte, nó phải có giá trị 0, 128, 256 ..., nóicách khác là địa chỉ này phải tương ứng với địa chỉ trang, và phải chia hết cho 128 vì địa chỉ trang 0 là 0, trang 1 là 128, ... ,trang n là n*128

Page 48: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 40 / 82

Hàm này sẽ ghi mảng 128 byte dữ liệu trong vùng RAM có địa chỉ bắt đầu là raddr vào vùng FLASH có địa chỉ raddr theo chếđộ ghi trang.

• Hàm đọc một trang dữ liệu từ FLASH

void read_page_flash(unsigned int* raddr, unsigned int* faddr);

Trong đó:

– raddr là tham số địa chỉ vùng RAM chứa dữ liệu cần đọc từ vùng Flash. Địa chỉ này là địa chỉ theo byte.

– faddr là tham số địa chỉ vùng FLASH cần dọc dữ liệu, địa chỉ này là địa chỉ theo byte, nó phải có giá trị 0, 128, 256 ..., nóicách khác là địa chỉ này phải tương ứng với địa chỉ trang, và phải chia hết cho 128 vì địa chỉ trang 0 là 0, trang 1 là 128, ... ,trang n là n*128

Hàm này sẽ đọc một trang dữ liệu trong vùng FLASH có địa chỉ faddr và lưu toàn bộ trang dữ liệu đó vào vùng RAM có địachỉ raddr theo chế độ đọc trang.

• Hàm ghi 2 byte dữ liệu vào FLASH

void write_flash(unsigned int rdata, unsigned int* faddr);

Trong đó:

– raddr là tham số dữ liệu cần vào vùng Flash.

– faddr là tham số địa chỉ vùng FLASH cần ghi dữ liệu, địa chỉ này là địa chỉ theo byte và phải chia hết cho 2.

Hàm này sẽ ghi dữ liệu rdata vào vùng FLASH có địa chỉ faddr.

• Hàm đọc 2 byte dữ liệu từ FLASH

unsigned int read_flash(unsigned int* faddr);

Trong đó faddr là tham số địa chỉ vùng FLASH cần đọc dữ liệu, địa chỉ này là địa chỉ theo byte và phải chia hết cho 2. Hàmnày sẽ đọc dữ liệu trong vùng FLASH. Giá trị trả về của hàm là 2 byte dữ liệu đọc ra từ vùng FLASH có địa chỉ faddr.

3.3.13 Các hàm chuỗi (string.h)

• Nối các chuỗi với nhau:

char * strcat(char *, char *);

• Sao chép chuỗi:

char * strcpy(char * dest, char * src);

• Tìm vị trí của một ký tự trong chuỗi:

char * strchr(char *, char);

• So sánh hai chuỗi:

int strcmp(char *, char *);

• Tìm vị trí của bất kỳ ký tự thuộc một chuỗi trong chuỗi khác:

int strcspn(char *, char *);

• Lấy độ dài của chuỗi:

unsigned short strlen(char *);

Page 49: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 41 / 82

• Nối một phần của một chuỗi vào chuỗi khác:

char* strncat(char* dest, char* src,unsigned int size );

• So sánh một phần của một chuỗi so với chuỗi khác:

int strncmp(char * dest, char * src, unsigned int size);

• Sao chép một phần của chuỗi vào chuỗi khác:

char* strncpy(char* dest, char* src, unsigned int size);

3.3.14 Các hàm toán học (math.h)

float sinf(const float x) ;float cosfconst float x) ;float tanfconst float x) ;float cotfconst float x) ;float asinf(const float x) ;float acosf(const float x) ;float atanf(const float x) ;float atan2f(const float x, const float y);float sinhf(const float x) ;float coshf(const float x) ;float tanhf(const float x) ;float expf(const float x);float logf(const float x) ;float log10f(const float x) ;float powf(const float x, const float y);float sqrtf(const float a) ;float fabsf(const float x) ;float frexpf(const float x, int *pw2);float ldexpf(const float x, const int pw2);float ceilf(float x) ;float floorf(float x) ;float modff(float x, float * y);

Page 50: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 42 / 82

Chương 4

Môi trường phát triển tích hợp (IDE) IFast

4.1 Giới thiệu

IFast là một môi trường phát triển tích hợp được phát triển để hỗ trợ các lập trình viên một cách toàn diện, nhanh chóng trongviệc thiết kế các chương trình ứng dụng. IFast là một IDE nhỏ gọn, dể sử dụng và có đầy đủ tính năng của một môi trường pháttriển hiện đại. Các tính năng đáng chú ý của IFast:

• Quản lý dự án

• Quản lý tập tin

• Làm nổi bật ngữ pháp (Syntax Highlighting)

• Chức năng build

• Chức năng nạp

• Các chức năng tìm kiếm

• Gợi ý từ khóa (AutoCompletion)

• Tùy biến giao diện

• Thu nhỏ/Mở rộng mã nguồn (Code Folding)

IFast sẽ mang lại sự hỗ trợ tốt nhất có thể cho lập trình viên trong quá phát triển các ứng dụng. Với khả năng tùy biến cao, nhiềuchức năng được cho phép cấu hình, người dùng có thể cá nhân hóa IFast một cách dễ dàng để thuận tiện, nhanh chóng, dễ nhớ,dễ sử dụng các chức năng của IFast. IFast có thể cài đặt trên nhiều nền tảng hệ điều hành khác nhau như:

• Windows 7/XP

• Ubuntu/Debian

• Redhat/CentOS

IFast hỗ trợ hai ngôn ngữ lập trình chính C/C++ và ASM cho các dự án được tạo từ IFast. Ngoài ra, IFast cũng hỗ trợ nhiều loạingôn ngữ lập trình khác.

IFast được viết riêng cho trình biên dịch SG8V1 và là môi trường tốt nhất để lập trình cho vi xử lý này. Người dùng có thể dễdàng viêt, biên dịch và nạp một chương trình vào trong vi xử lý SG8V1 chỉ với (IDE) IFast. Trong IFast cũng cung cấp sẵn mộtbộ tạo mã nguồn mẫu giúp cho người mới sử dụng IFast có thể nhanh chóng nắm bắt được cách hoạt động của nó.

Mục đích của chương này là giới thiệu các tính năng của phần mềm nhằm giúp người dùng có thể nắm được cách tạo dự án mới,cấu hình các tính năng của trình biên dịch, biên dịch mã nguồn thành mã máy và nạp mã máy này vào vi xử lý.

IFast thuộc bản quyền của Trung Tâm Nghiên Cứu và Đào Tạo Thiết Kế Vi Mạch (ICDREC) và được phát hành miễn phí đến tấtcả người dùng.

Page 51: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 43 / 82

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

4.2.1 Cài đặt IFast trên Windows

Nhấn đôi vào tập tin cài đặt IFast. Tên tập tin này là “Setup_iFast.exe”, giao diện “Welcome” sẽ hiện ra như hình.

Hình 4.1: Hộp thoại chào mừng của quá trình cài đặt IFast

Page 52: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 44 / 82

Sau đó, nhấn nút “Next”, màn hình hiển thị hộp thoại bảng quyền như sau:

Hình 4.2: Giao ước giữa IFast và người dùng

Chọn ô “I accept the terms of the License Agreement” để chấp chận giấy phép bản quyền, sau đó nhấn nút “Next” để tiếp tục cài

Page 53: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 45 / 82

đặt. Hộp thoại tùy chọn cài đặt cho IFast sẽ hiện ra như hình sau:

Hình 4.3: Hộp thoại chọn thành phần cài đặt

Trong đó, ô “SG8V1 Compiler Suite” có nghĩa là cài đặt thêm trình biên dịch SG8V1, ô “Links in Start Menu” có nghĩa là càiđặt thêm biểu tưởng IFast trên thanh “Start Menu” của Windows, ô “Links in Desktop” nghĩa là cài đặt thêm biểu tượng trên trêndesktop của Windows. Theo mặc định thì cả ba ô này đều được chọn. Nhấn nút “Next” để tiếp tục cài đặt, màn hình xuất hiện

Page 54: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 46 / 82

giao diện chọn thư mục cài đặt chương trình IFast.

Hình 4.4: Hộp thoại chọn đường dẫn cài đặt

Nếu ở Windows 7 thì thư mục cài đặt mặc định là “C:\Program files(x86)\icdrec\ifast”. Người dùng có hai lựa chọn trong giaiđoạn này:

• Nếu muốn hủy bỏ cài đặt thì nhấn nút “Cancel”.

• Nếu muốn thay đổi đường dẫn cài đặt thì nhấn nút “Browse...” và chọn thư mục cài đặt mới cho IFast.

Page 55: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 47 / 82

Sau đó nhấn nút “Install” thì hộp thoại thể hiện chi tiết quá trình cài đặt chương trình sẽ xuất hiện như dưới đây.

Hình 4.5: Hộp thoại thể hiện quá trình cài đặt của IFast

Page 56: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 48 / 82

Sau khi quá trình cài đặt hoàn tất, màn hình hiển thị một hộp thoại như hình dưới đây.

Hình 4.6: Hộp thoại thông báo quá trình cài đặt đã thành công.

Nhấn nút “Finish” để hoàn tất quá trình cài đặt IFast. Nếu người dùng chọn ô “Run Program” thì sau khi nhấn nút “Finish”, IFastsẽ được khởi động ngay lập tức.

4.2.2 Cài đặt trên Ubuntu/Debian

Nhấn phím Alt+F2, gõ “gnome-terminal” để mở terminal. Sau đó, di chuyển đến thư mục chứa tập tin cài đặt IFast. Trên Debian6 (32bit), tên tập tin này là “iFast-Debian6.0.6-32bit.run”. Gõ lệnh “./ iFast-Debian6.0.6-32bit.run” để bắt đầu thực hiện cài đặt.

Page 57: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 49 / 82

Terminal sẽ hiển thị như sau:

Hình 4.7: Quá trình cài IFast trên Ubuntu/Debian

Nếu muốn cài cặt thêm trình biên dịch SG8V1 thì gõ “y” rồi nhấn Enter để thực hiện quá trình cài đặt. Sau khi quá trình cài đặtthành công, terminal sẽ hiển thị như sau:

Hình 4.8: Thông báo quá trình cài IFast trên Ubuntu/Debian thành công

4.3 Giao diện lập trình của IFast

Giao diện của IFast được thiết kế nhằm giúp người dùng có thể dễ dàng quản lý dự án của mình. Giao diện của nó thừa hưởng bốcục quen thuộc của các môi trường phát triển lâu năm trên thị trường nhắm giúp người dùng không phải mất thời gian làm quenvới bố cục mới. Giao diện IFast hỗ trợ tùy biến, người sử dụng có thể thay đổi tùy thích cách bố trí các khối trong IFast bằng cách

Page 58: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 50 / 82

kéo thả các khối. Hình phía dưới mô tả giao diện của một dự án được phát triển bằng IFast.

Hình 4.9: Giao diện IFast

Giao diện của IFast được chia làm thành nhiều khối, trong hình là giao diện cơ bản của IFast:

• Phần khối Editor (màu xanh lá-số 1): Trình biên tập mã nguồn của IFast với các chức năng chính như tô màu từ khóa, hỗ trợgiao diện tab, thu gọn mã nguồn và gợi ý từ khóa. Đối với những người chưa quen với những tính năng kể trên thì có thể thamkhảo bảng mô tả dưới đây:

– Tô màu từ khóa: giúp người dùng dễ dàng nắm bắt được ý tưởng của dự án bằng cách tô màu các từ khóa của ngôn ngữ lậptrình, các bình luận cũng như các hằng số trong mã nguồn.

– Giao diện tab: thay vì hiển thị mỗi tập tin được người dùng mở trong từng cửa số riêng biệt, IFast sẽ hiển thị mỗi tập tin bằngmột tab ở góc trên-trái của trình biên tập mã nguồn. Điều này giúp người dùng dễ dàng di chuyển nhanh chóng giữa các tậptin quan trọng trong dự án, giúp tiết kiệm một cách đáng kể thời gian và công sức dùng để phát triển dự án.

– Thu gọn mã nguồn: giúp người dùng nhanh chóng nắm bắt được cách mã nguồn được tổ chức bằng cách giấu phần thân củacác hàm, các vòng lặp, các câu cú pháp điều kiện ...

– Gợi ý từ khóa: rút gọn thời gian phát triển dự án và tiết kiệm công sức của người sử dụng bằng cách đề nghị tất cả các từkhóa, tên hàm, tên biến dựa vào những gì mà người dùng đang gõ trong trình biên dịch mã nguồn. Đây chính là chức năngcần thiết nhất mà bất kỳ trình biên tập mã nguồn nào cũng phải có.

• Khối Log & Other (màu tím-số 2): Hiển thị thông tin trong quá trình hoạt động của IFast được chia làm 3 thẻ: Status: hiển thịthông tin dự án/tập tin được đóng/mở. Message: hiển thị kết quả của các quá trình tìm kiếm. Compiler: hiển thị kết quả trả vềcủa trình biên dịch, lỗi và cảnh báo cho các tập tin được sử dụng trong quá trình biên dịch.

• Khối Management (màu cam-số 3): Thẻ Project liệt kể tất cả các tập tin được sử dụng trong dự án và chỉ có những tập tin liệtkê ở đây cùng với các thư viện mới được tham gia trong quá trình dịch dự án ra mã máy. Thẻ Symbol thì liệt kê tất cả các hàm,biến, cấu trúc dữ liệu dùng trong dự án. Khi người dùng nhấn đôi vào tên một hàm, biến hay cấu trúc dữ liệu thì IFast sẽ tựđộng nhảy tới vị trí khai báo tương ứng của nó trong dự án. Chức năng này giúp người dùng dễ dàng quản lý một dự án lớn vớinhiều hàm/biến.

Page 59: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 51 / 82

• Khối Project Information (màu hồng-số 4): Hiển thị thông tin của dự án như: tên dự án, loại dự án, dung lượng của chươngtrình, danh sách symbols cùng với địa chỉ, kích thước của các symbols.

• Khối Open files list (màu xanh dương-số 5): Hiển thị danh sách các tập tin đã được mở trên trình biên tập mã nguồn bao gồmcác tập tin trong dự án và ngoài dự án.

• Khối Menu/Toolbar (màu đen-số 6): Menu và thanh công cụ chính của IFast. Người dùng có thể sử dụng tất cả các chức nănghiện có của chương trình thông qua phần này.

Ngoài ra, còn một số khối khác hỗ trợ cho các chức năng mở rộng của IFast. Menu View cho phép cấu hình (ẩn/hiện) đầy đủ cáckhối giao diện được hỗ trợ bởi IFast.

4.4 Các tính năng chính của IFast

IFast được phát triển giúp lập trình viên có thể phát triển các ứng dụng dễ dàng, nhanh chóng, thuận tiện. Mỗi ứng dụng được môhình hóa bằng dự án trong IFast. IFast giúp các nhà phát triển dễ dàng quản lý dự án của mình đồng thời mang đến cho người sửdụng cách thức thao tác trên các tập tin mã nguồn của mình tốt nhất, linh hoạt và hiệu quả nhất.

4.4.1 Quản lý Dự Án

Dự án là một tập hợp các tập tin dùng để tạo ra mã máy bằng một trình biên dịch thích hợp. Ngoài ra, dự án của IFast còn lưu cáccấu hình của môi trường phát triển và trình biên dịch nhằm giúp người dùng cá nhân hóa dự án của mình. Tất cả các tập tin dự ánđều có phần mở rộng mặc định là “.ifast”. IFast cho phép mở nhiều dự án cùng lúc, mỗi dự án sẽ được mở trên một cửa sổ IFastriêng biệt.

Page 60: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 52 / 82

4.4.1.1 Tạo một dự án mới

Người dùng có thể tạo ra một dự án mới bằng cách truy cập vào Project→New. Khi đó một hộp thoại với tiêu đề Create NewProject sẽ được hiển thị như trong dưới và người dùng chỉ việc chọn loại dự án mà mình mong muốn.

Hình 4.10: Giao diện tạo dự án mới

Sau khi chọn dự án mà mình mong muốn, một hộp thoại khác sẽ hiện ra như phía dưới để người dùng có thể đặt tên và nêu ra vịtrí mà mình muốn lưu dự án trên. Một khi tất cả các bước trên đã được thực thi thì một hộp thoại tổng kết những thông tin về dự

Page 61: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 53 / 82

án sắp được tạo sẽ hiện ra để người dùng duyệt lại. Người dùng chỉ việc bấm Finish để chương trình tạo ra một dự án mới.

Hình 4.11: Giao diện thông tin dự án

4.4.1.2 Mở một dự án có sẵn

Một dự án có sẵn có thể được mở bằng cách truy cập Project→Open. Sau đó thì một hộp thoại sẽ xuất hiện để người dùng có thểduyệt tới nơi chứa tập tin dự án mà mình mở. Khi tập tin dự án được mở thì IFast sẽ hiển thị giao diện gần đây nhất của nó.

4.4.1.3 Đóng dự án

Để đóng một dự án đang mở, người dùng chỉ việc sử dụng Project→Close. Nếu trong dự án có một tập tin nào đó chưa được lưuthì một hộp thoại sẽ xuất hiện và yêu cầu người dùng lưu tập tin này lại. Sau đó, cho dù người dùng có lưu tập tin này lại haykhông thì dự án cũng sẽ được đó. Ngoài ra, người dùng có thể nhấp chuột phải trên tên của dự án đang được mở trong thẻ Projectcủa khối Management và chọn Close.

4.4.1.4 Thêm tập tin mã nguồn vào trong dự án

Để có thể tận dụng các tập tin mã nguồn có sẵn, giảm thời gian viết code cho người dùng, IFast cung cấp 2 chức năng để ngườisử dụng có thể nhanh chóng thêm những tập tin mã nguồn có sẵn vào trong dự án của mình đó là:

Page 62: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 54 / 82

• Add files recursively (Thêm tập tin đệ quy): Thêm tất cả các tập tin hợp lệ trong thư mục được chỉ định và trong tất cả các thưmục con của nó.

• Add file (Thêm 1 tập tin): Thêm vào dự án một tập tin có đường dẫn tuyệt đối.

Để thêm tập tin vào dự án có 2 cách để thực hiện:

• Từ Menu Project chọn Add file hoặc Add files recursively

• Nhấp chuột phải vào tên dự án trong thẻ Project thuộc khối Management, chọn Add file hoặc Add files recursively

4.4.2 Quản lý Tập Tin

Các tập tin nguồn là những tập tin chứa mã của dự án mà người dùng đang phát triển. Những tập tin này giúp bạn điều khiển vixử lý để thực thi những thao tác mà mình mong muốn. Giống như bất kỳ môi trường phát triển nào, IFast cho phép người dùngthêm hay bớt các tập tin nguồn ra khỏi dự án. Điều này cho phép người dùng có thể tận dụng các tập tin nguồn cũ từ những dựán trước đây vào dự án mới, giúp tiết kiệm thời gian và công sức để hoàn thành dự án mới. Mỗi tập tin được mở được cụ thể hóabằng một thẻ trên khối Editor.

4.4.2.1 Mở một tập tin mã nguồn có sẵn

Để mở một tập tin mã nguồn có sẵn thì người dùng phải truy cập vào File→Open (phím tắt Ctrl + O) hay chọn nút Open AnExisitng File trên thanh công cụ và một hộp thoại sẽ hiện lên để bạn chọn tập tin mà mình muốn mở. Khi đã chọn đươc tập tinmong muốn, người dùng chỉ cần bấm Open để mở tập tin này. Ngoài ra thì nhấn đôi vào một tập tin được liệt kê trong tab Projectcủa cũng sẽ mở tập tin đó ra. Tập tin được IFast mở sẽ hiện ra trong một tab ở góc trên-trái của trình biên tập mã nguồn được tíchhợp trong IFast.

4.4.2.2 Tạo mới một tập tin nguồn

Người dùng có hai phương án để tạo ra một tập tin mã nguồn mới. Đó là tập tin nguồn theo mẫu và không theo mẫu. Để tạo ramột tập tin nguồn không theo mẫu thì người dùng chỉ việc truy cập vào File→New. Còn nếu muốn tạo ra một tập tin nguồn mớitheo mẫu thì người dùng phải truy cập vào File→New (with template) và chọn mẫu mà mình mong muốn.

4.4.2.3 Thêm tập tin có sẵn vào dự án

Một tập tin được mở trên trình soạn thảo (Editor) không đồng nghĩa với tập tin đó đã được thêm vào dự án. Người dùng có thểthêm một tập tin đang được mở mà không có dự án bằng cách nhấp chuột phải vào đường dẫn của tập tin đó trong khối Openfiles list và chọn Add project. Ngoài ra, có thể thêm tập tin đó vào trong dự án bằng cách Menu Project→Add files, chọn đườngdẫn của tập tin cần thêm vào.

4.4.2.4 Các thao tác trên tập tin nguồn

Môi trường phát triển tích hợp IFast kế thừa đầy đủ các chức năng của một trình soạn thảo như sao chép, xoá, dán, thêm kí tự,vv... IFast cung cấp thêm một số tính năng như:

• Làm nổi bật ngữ pháp (Syntax Highlighting)

• Thu nhỏ/Mở rộng mã nguồn (Code Folding)

• Tự động canh chỉnh hàng (Auto-indentation)

• Gợi ý từ khóa (AutoCompletion)

• Các chức năng di chuyển (Go to Line, Go to Declaration/Implementation)

Page 63: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 55 / 82

• Các chức năng tìm kiếm (Find/Replace, Find/Replace in Files, Find Occurences)

• Hoán đổi tập tin (Swap Source/Header)

Ngoài ra, IFast cho phép người sử dụng có quyền cấu hình cao nhất đối với tập tin như: chỉnh sửa Syntax Highlighting chotừng ngôn ngữ lập trình, Kí tự kết thúc hàng trong tập tin, vv ... Tất cả các tùy chỉnh cấu hình được thực hiện trong Preferences(Edit→Preferences).

4.5 Chức năng Tìm Kiếm, Thay Thế và Đi Tới

IFast hỗ trợ các chức năng sau

• Find (Tìm Kiếm)

• Find in Files (Tìm Kiếm trong các tập tin)

• Find Occurences (Tìm kiếm sự xuất hiện)

• Replace (Thay Thế)

• Replace in Files (Thay Thế trong các tập tin)

• Goto Line (Đi Tới dòng)

• Goto Declaration/Implementation (Đi Tới khai báo/thực thi)

• Goto Function (Đi tới hàm)

• Swap Header/Source (Chuyển đổi qua lại giữa tập tin nguồn/tập tin khai báo)

4.5.1 Find (Tìm Kiếm)

Find cho phép tìm kiếm một từ, cụm từ xuất hiện trong tập tin đang được mở. Để tối ưu hóa chức năng tìm kiếm, người sử dụngcó thể dùng các tùy chọn được hỗ trợ. Hộp thoại Find như sau.

Page 64: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 56 / 82

Hình 4.12: Giao diện chức năng Find

4.5.2 Find in Files(Tìm Kiếm trong các tập tin)

Find in Files là chức năng mở rộng của Find cho phép tìm kiếm sự xuất hiện của một từ/cụm từ trong nhiều tập tin. Kết quả củaquá trình tìm kiếm này sẽ được xuất ra trong khối Log & Others và trong thẻ Message. Cũng như Find, Find in Files cũng có cáctùy chọn giúp người dùng dễ dàng tối ưu hóa quá trình tìm kiếm của mình. Có hai tùy chọn để người dùng chỉ định những tập tincần được tìm kiếm (trong khung Scope) đó là:

• Tìm kiếm trong tất cả các tập tin của dự án (Project)

• Tìm kiếm trong tất cả các tập tin đang được mở (Open files)

Page 65: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 57 / 82

Hình 4.13: Giao diện chức năng Find in Files

4.5.3 Find occurences(Tìm Kiếm sự xuất hiện)

Find occurences có chức năng tương tự với Find in Files nhưng chỉ dùng để tìm kiếm một kí tự chính xác (Match case) trongphạm vi toàn bộ các tập tin (trong dự án và các tập tin không thuộc dự án mà đang được mở). Để sử dụng chức năng này, ta chỉcần nhấp chuột vào kí tự cần tìm kiếm, sau đó nhấp chuột phải và chọn Find Occurences of "". Kết quả của quá trình được xuấtra trong khối Log & Others.

4.5.4 Replace (Thay Thế)

Replace là chức năng dùng để thay thế một từ/cụm từ trong tập tin đang được mở bằng một từ/cụm từ hoặc kí tự rỗng. Tương tựnhư Find, ta có thể dùng các tùy chọn để tối ưu hóa cho chức năng này. Hộp thoại Replace như sau:

Page 66: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 58 / 82

Hình 4.14: Hộp thoại Replace

4.5.5 Replace in Files (Thay Thế trong tập tin)

Replace in Files là chức năng mở rộng của Replace. Replace in Files cho phép thay thế một từ/cụm từ bằng một từ/cụm từ hoặckí tự rống trong các tập tin được chỉ định thay thế (trong dự án hoặc đang được mở). Hộp thoại Replace in Files như sau:

Page 67: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 59 / 82

Hình 4.15: Hộp thoại Replace in Files

4.5.6 Goto line (Đi Tới dòng)

Goto line giúp di chuyển con nháy chuột đến một dòng mới trong tập tin đang được mở nhanh chóng. Goto line rất có ích khi cầndi chuyển vị trí hiện tại của con nháy chuột đi một khoảng cách xa trong các tập tin có độ lớn cao. Để sử dụng chức năng này cóthể dùng một trong 3 cách sau:

• Sử dụng trực tiếp trên toolbar

• Menu Search→Goto line

• Sử dụng phím tắt

Page 68: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 60 / 82

4.5.7 Goto Declaration/Implementation (Đi Tới Khai Báo/Thực thi)

Goto Declaration/Implementation dùng xác định vị trí khai báo của một biến, hàm,... hoặc xác định vị trí thi hành của một hàm,macro. Để sử dụng chức năng này, có thể dùng như sau: Chọn biến/hàm/macro sau đó nhấp chuột phải chọn Goto Declaration/Im-plementation hoặc sử dụng phím tắt.

4.5.8 Goto Function (Đi Tới Hàm)

Goto Function cho phép con nháy chuột di chuyển nhanh đến vị trí khai báo/thực thi của một hàm trong tập tin đang được mở.Chức năng này chỉ hỗ trợ cho các tập tin mã nguồn và các tập tin thuộc ngôn ngữ (C/C++).Cách sử dụng:

• Show Function Đây là công cụ hiển thị tên hàm hiện tại đang được sửa đổi và được đặt trên thanh Toolbar. Để đi tới một hàm,chọn vào mũi tên trên công cụ và chọn hàm cần di chuyển tới.

Hình 4.16: Công cụ Show Function

• Menu Search→Goto Functions

• Phím tắt

4.5.9 Swap Header/Source (Chuyển đổi qua lại giữa tập tin nguồn/tập tin khai báo)

Swap Header/Source cho phép lập trình viên chuyển đổi nhanh chóng giữa source và header. Chức năng này chỉ hỗ trợ cho cáctập tin thuộc ngôn ngữ C/C++. Trong trường hợp nếu tập tin Header/Source không tồn tại thì sẽ tạo ra tập tin Source/Headertương ứng khi cần. Để sử dụng chỉ cần nhấp chuột phải trên tập tin cần hoán đổi, chọn Swap Header/Source hoặc sử dụng phímtắt.

4.6 Chức năng biên dịch

IFast hỗ trợ tích hợp nhiều trình biên dịch cho phép người dùng có thể lựa chọn kiểu dự án phù hợp với nhu cầu của ứng dụng.Mỗi trình biên dịch có một nhiều kiểu dự án khác nhau. Quá trình biên dịch của IFast sẽ phụ thuộc kiểu dự án và trình biên dịchđể có quá trình biên dịch phù hợp. Các quá trình biên dịch đều được IFast thực hiện tự động, người sử dụng chỉ cần định hướngban đầu cho dự án của mình. Quá trình biên dịch sẽ biên dịch các tập tin nguồn thành các tập tin thực thi. Các tập tin nguồn cóthể là các tập tin mã nguồn C/C++ hoặc các tập tin dạng ngôn ngữ thực thi ASM. Quá trình biên dịch cần phải có một dự án cụthể, do đó cần có một dự án trước khi có thể dùng chức năng biên dịch. Menu Build cho phép chọn các chức năng tương ứng vớiyêu cầu của người lập trình.

• Build

Thực hiện biên dịch một dự án thành các tập tin thực thi.

• Rebuild

Cấu hình và biên dịch lại một dự án thành các tập tin thực thi.

• Clean All

Xóa bỏ các cấu hình và các tập tin đã được biên dịch.

• Build and Load

Thực hiện biên dịch một dự án và nạp tập tin thực thi của dự án đó vào trong vi xử lý thông qua các mạch nạp.

Page 69: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 61 / 82

4.7 Chức năng nạp

Nạp là một chức năng được mở rộng cho (IDE) IFast giúp người dùng thống nhất, dễ dàng và nhanh chóng trong quá trình nạptập tin thực thi vào vi xử lý. Chức năng này có thể sử dụng thông qua 3 cách như sau:

• Dùng console

Thông qua các chương trình như Terminal (Linux) hoặc CMD (Windows) gọi chương trình icprog -nằm cùng thư mục cài đặtvới IFast. "icprog" cung cấp đầy đủ các chức năng của một chương trình nạp cho vi xử lý, để có thông tin đầy đủ về các chứcnăng và các tùy chọn của chương trình "icprog", ta có thể dùng tùy chọn –help để xem thông tin.

Hình 4.17: Các chức năng và tùy chọn của icprog

• Chức năng "Build and Load" trong menu "Build"

Chức năng nạp trong menu "Build" giúp chúng ta nhanh chóng trong việc nạp một tập tin thực thi vào vi xử lý. Giao diện củachức năng nạp trong Build đơn giản và chỉ thực hiện một chức năng duy nhất nạp tập tin thực thi vào trong vi xử lý. Trên giaodiện của chức năng nạp này thông báo cho ta biết tốc độ nạp, phần trăm đã được nạp, khối lượng byte đã nạp.

Hình 4.18: Giao diện chức năng nạp (Build and Load)

• Chương trình Programming

Programming là một công cụ được tích hợp vào IFast, giúp người dùng có cái nhìn trực quan, thân thiện và dễ sử dụng hơncủa chức năng nạp. Programming cung cấp đầy đủ chức năng của một công cụ nạp và mang tính đặc trưng riêng cho vi xử lý

Page 70: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 62 / 82

SG8V1. Để có thể xử dụng được công cụ Programming ta vào menu Tools->Programming

Hình 4.19: Giao diện công cụ Programming

Giao diện của ProgrammingGiao diện của Programming được chia ra thành nhiều phần dựa vào chức năng của các thành phần.

– Giao tiếp (Communication)Cung cấp các chức năng giao tiếp như: Kết nối, ngắt kết nối, thiết lập lại.

– Tần số (Frequency)Công cụ Programming cung cấp 2 tần số để nạp vào vi xử lý là: <= 12Mhz và > 12Mhz.

– Các chức năng nạp (Programming)Đây là các chức năng cơ bản của một chương trình nạp được hỗ trợ bằng giao diện giúp cho người dùng để dàng sử dụng.

– Hệ thống tập tin (Files)Thực hiện các chức năng đối với các tập tin như chọn tập tin nạp, xuất nội dung đọc được ra tập tin

– Hiển thị nội dung (Programming memory)Hiển thị dạng HEX và ASCII nội dung tập tin nguồn dùng để nạp và bộ nhớ vi xử lý khi đọc lên.

– Cấu hình (Phần màu đỏ)

Page 71: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 63 / 82

Hiển thị các tùy chọn cấu hình cho công cụ nạp.

Hình 4.20: Giao diện cấu hình của công cụ Programming

– Thông tinTên tập tin nguồn (Phần màu vàng).Phần trăm tác vụ đang thực hiện (Phần màu xanh).Thông tin kết nối, tên tác vụ đang chạy, tốc độ đọc/ghi, dung lượng đọc/ghi, vv... (Phần màu hồng).

Các chức năng của Programming

– Kết nối/Ngắt kết nối (Connect/Disconnect)Dùng để kết nối/ngắt kết nối công cụ Programming với mạch nạp.

– Ghi (Write)Nạp tập tin thực thi vào vi xử lý.

– Đọc (Read)Đọc nội dung bộ nhớ vi xử lý lên.

– Xóa (Erase)Xóa nội dung bộ nhớ vi xử lý.

– Thiết lập lại (Reset)Thiết lập lại vi xử lý SG8V1.

– Kiểm tra vi xử lý trống (Blank Check)Kiểm tra vi xử lý có nội dung nào được ghi chưa.

– Kiểm chứng (Verify)So sánh nội dung bộ nhớ của vi xử lý có giống với nội dung của tập tin được đưa vào (import).

– Nhập tập tin (Import)Cho phép chọn tập tin dùng để nạp hoặc kiểm chứng với nội dung của bộ nhớ vi xử lý.

– Xuất tập tin (Export)Cho phép xuất nội dung bộ nhớ vi xử lý thành tập tin thực thi

– Cấu hình (Configure)Cung cấp các tùy chọn kèm theo của các chức năng như Ghi và Nhập tập tin.

Page 72: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 64 / 82

4.8 Cấu hình trình biên dịch

Trong mục chức năng biên dịch, IFast có khả năng tích hợp nhiều trình biên dịch khác nhau, do đó để có thể cấu hình lại trìnhbiên dịch cần xem xét trình biên dịch hiện tại của dự án và trình biên dịch của Preferences có đồng nhất với nhau hay không. Đểcấu hình trình biên dịch, từ menu Edit→Preferences→Compiler Settings. Có thể thay đổi trình biên dịch cần được cấu hình bằngcách chọn trình biên dịch thích hợp trong khung Selected Compiler.

Page 73: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 65 / 82

4.8.1 Cấu hình biên dịch

IFast hỗ trợ người sử dụng thiết lập các cờ cho trình biên C và ASM trong lúc biên dịch. Các cờ này sẽ thay đổi tùy theo trìnhbiên dịch mà người sử dụng chọn. Để hiểu thêm về các cờ, xem Section 4.8.5.

Hình 4.21: Hộp thoại cấu hình tính năng trình biên dịch C

4.8.2 Cấu hình trình liên kết

Để cấu hình trình liên kết (Linker) thì người dùng chỉ việc thực hiện các thao tác giống y như việc cấu hình cờ của trình biêndịch, chỉ khác là người dùng phải chọn tab Linker Settings thay cho Compiler Settings. Trong tab Linker Settings gồm hai mục

Page 74: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 66 / 82

là danh sách các thư viện mà trình liên kết sẽ dùng trong quá trình tạo ra mã máy và các bảng cấu hình cờ của trình liên kết. Đểthêm một thư viện mới để phục vụ cho trình biên dịch thì người dùng chỉ việc bấm nút Add và chọn tập tin thư viện mà mìnhmong muốn. Sau đó, đường dẫn của thư viện này sẽ xuất hiện trong ô Linker Libraries.

Hình 4.22: Hộp thoại cấu hình trình liên kết

4.8.3 Cấu hình đường dẫn của các trình biên dịch và trình thực thi

Để có thể sử dụng các trình biên dịch và trình liên kết được tích hợp trong IFast, người dùng phải chỉ ra được đường dẫn củanhững chương trình này thông qua tab Toolchain executable. Có năm đường dẫn cần phải được chỉ rõ là đường dẫn của trình biên

Page 75: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 67 / 82

dịch C, trình biên dịch hợp ngữ, trình liên kết dành cho thư viện tĩnh và trình liên kết dành cho thư viện động. Ngoài ra cách tựdò đường dẫn một cách thủ công, IFast còn hỗ trợ việc dò tìm đường dẫn tự động thông qua nút Auto-detect.

Hình 4.23: Cấu hình đường dẫn của trình biên dịch/trình liên kết

Page 76: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 68 / 82

4.8.4 Các cấu hình khác

Ngoài các các cài đặt dành cho trình biên dịch cũng như trình liên kết, người dùng cũng có thể cấu hình một số chức năng linhtinh như hiển thị toàn bộ nội dung được trả về bởi trình biên dịch trong quá trình dịch và tự động bật tab thông tin lên khi dịch.

Hình 4.24: Hộp thoại dùng cho việc cấu hình các chức năng khác

4.8.5 Cờ trình biên dịch

Các cờ của trình biên dịch mà người dùng có thể thay đổi là:

Page 77: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 69 / 82

• Trình biên dịch SG8V1Cờ trình biên dịch C

– [–Werror]: xem tất cả các cảnh báo tương đương như lỗi. Điều này có nghĩa là trình biên dịch sẽ không hoàn tất quá trìnhdịch khi gặp bất kỳ cảnh báo nào.

– [–debug]: Cho phép xuất các ký tự dùng cho việc gỡ rối.

– [–std-c89]: Biên dịch dựa theo chuẩn ANSI-89.

– [–std-sdcc89]: Biên dịch dựa theo chuẩn ANSI-89 được mở rộng bởi SG8V1.

– [–call-soft-stack]: Dùng stack phần mềm cho các lệnh gọi hàm.

– [–no-reg-asm]: vô hiệu hóa chức năng tối ưu thanh ghi của trình biên dịch hợp ngữ.

– [–funsinged-char]: Biến từ khóa char thành kiểu biến không dấu.

– [–dump-raw]: Xuất ra cấu trúc RAW sau lần duyệt đầu tiên.

– [–dump-gcse]: Xuất ra cấu trúc GCSE sau lần duyệt đầu tiên.

– [–dump-loop]: Xuất ra cấu trúc LOOP sau lần duyệt đầu tiên.

– [–dump-deadcode]: Xuất ra cấu trúc DEADCODE sau lần duyệt đầu tiên.

– [–dump-liverange]: Xuất ra cấu trúc LIVERANGE sau lần duyệt đầu tiên.

– [–dump-regpack]: Xuất ra cấu trúc REGPACK sau lần duyệt đầu tiên.

– [–dump-reassign]: Xuất ra cấu trúc REASSIGN sau lần duyệt đầu tiên.

– [–dump-tree]: Xuất ra cấu trúc TREE sau lần duyệt đầu tiên.

– [–dump-all]: Xuất ra cấu trúc sau lần duyệt đầu tiên.

– [–i-code-in-asm]: Thêm các chú thích “i code ...” trong các tập tin hợp ngữ được dịch ra từ tập tin c.

4.9 Cấu hình chức năng tô màu cú pháp

Chức năng tô màu cú pháp giúp sẽ tô màu các từ khóa của ngôn ngữ lập trình giúp ta nhanh chóng nắm bắt được cách sử dụng.Để cấu hình tính năng này, truy cập vào thực đơn Edit→ Preferences và chọn thẻ Syntax Highlighting. Tại đây, ta có thể tùy ýđiều chỉnh màu sắc và kiểu chữ (in nghiêng/in đậm) cho các thành phần của một tập tin nguồn như chỉ thị, hằng số, chú thích,toán tử . . . . Các ngôn ngữ mà IFast có hỗ trợ chức năng tô màu cú pháp là C/C++ và Assembly. Ngoài ra người dùng có thể thay

Page 78: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 70 / 82

đổi màu của một số thành phần chung như lề, số dòng ...

Hình 4.25: Hộp thoại cấu hình chức năng tô màu cú pháp

4.10 Cấu hình chức năng phím tắt

Nhằm giúp người dùng có thể thao tác một cách nhanh chóng, IFast có kèm theo chức năng phím tắt cho các chức năng quantrọng/thường sử dụng của chương trình như đóng/mở một tập tin... Để có thể thay đổi cấu hình dành cho tính năng này thì ta phảitruy cập vào thực đơn Edit→ Preferences và chọn thẻ Key bindings. Tại đây có một danh sách các chức năng của chương trình

Page 79: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 71 / 82

và các phím tắt tương ứng. Bấm đúp vào chức năng mà ta muốn đổi phím tắt rồi nhấn một tổ hợp phím tắt mới để gán cho chứcnăng này. Trong trường hợp tổ hợp phím tắt mới đã được gán cho chức năng khác thì IFast sẽ hiện một bảng thông báo và yêu cầungười dùng quyết định xem tổ hợp phím mới này sẽ dùng cho chức năng nào.

Hình 4.26: Cấu hình chức năng phím tắt

Page 80: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 72 / 82

Chương 5

Bootloader SG8V1

5.1 Cách viết chương trình bootloader

Trình biên dịch SG8-CC hỗ trợ viết chương trình bootloader, cách viết chương trình bootloader này tương tự như viết chươngtrình thông thường và sử dụng thư viện C. Chương trình bootloader phải được biên dịch với ‘linker shellscript’. Trìnhbiên dịch còn cung cấp một tập tin ‘linker shellscript’ mẫu dùng để biên dịch chương trình bootloader. Tập tin mẫunày tên bootcode.x, nếu cài trình biên dịch tích hợp trong gói cài đặt IDE IFast thì tập tin này nằm trong đường dẫn path_install_ifast/sg8cc/sg8/lib/ldscripts/ . Khi lập trình bootloader, người lập trình nên sao chép tập tin mẫunày đế thư mục chứa project. Cấu hình biên dịch với linker shellscript bằng cách chọn project→Properties để mở hộpthư thoại ‘Project Properties’, sau đó chọn thẻ ‘Linker settings’ và điền -T bootcode.x vào textbox ‘Otherlinker settings’ như hình ‘Other linker settings’

Hình 5.1: Hộp thư thoại ‘Other linker settings’

Nhấn nút ‘OK’ để lưu và thoát. Sau đó nhấn nút ‘build’ để biên dịch chương trình bootloader.

Page 81: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 73 / 82

5.2 Quản lý vùng nhớ Flash của bootloader

5.2.1 Tổ chức vùng Flash của bootloader

Vùng bootloader trong Flash gồm có 2 phần, được miêu tả trong hình

• Phần đầu chứa chương trình khởi tạo xử lý bootloader, thường chứa lệnh nhảy đến phần thứ 2 của bootloader.

• Phần thứ 2 chứa chương trình chính của bootloader.

Page 82: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 74 / 82

Hình 5.2: Sơ đồ tổ chức vùng nhớ Flash của bootloader

• begin_loader_addr: Là địa chỉ bắt đầu phần thứ nhất bootloader, địa chỉ này bắt buộc phải có giá trị 0x00 đối với SG8V1.

• begin_user_addr: Địa chỉ này là địa chỉ bắt đầu nạp chương trình của bootloader cho user. Địa chỉ này được tính toán bằngbegin_loader_addr cộng với kích thước của phẩn đầu của bootloader.

• begin_proLoader_addr: Địa chỉ này là địa chỉ bắt đầu của phần thứ hai của bootloader. Địa chỉ này được tùy chỉnh thông quashellscipt bootcode.x.

Page 83: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 75 / 82

5.2.2 Tổ chức các vùng nhớ trong 2 phần bootloader

Có rất nhiều cách tổ chức các vùng nhớ trong 2 phần bootloader. Nhưng ở đây, chỉ nói đến tổ chức vùng nhớ với shellscript sauđây.

OUTPUT_FORMAT("elf32-sg8","elf32-sg8","elf32-sg8")OUTPUT_ARCH(sg8)__stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 128;MEMORY{

text (rx) : ORIGIN = 0x0, LENGTH = 128kdata (rw!x) : ORIGIN = 0x800061, LENGTH = 0x3F9F

}SECTIONS{

__startup 0x00:{*(__startup)KEEP (*(__startup))

*(__startup.*)} > text/* Internal text space or external memory. */.text 0x10000:{*(__program_startup)*(__program_startup.*)*(.init)KEEP (*(.init))*(.init.*)*(__program_main)KEEP (*(__program_main))*(__program_main.*). = ALIGN(2);*(.text). = ALIGN(2);*(.text.*). = ALIGN(2);_etext = . ;} > text.rodata :{. = ALIGN(2);*(.rodata). = ALIGN(2);*(.rodata.*)} > text.register :{*(.register)KEEP (*(.register))} > data.data :{PROVIDE (__data_start = .) ;*(.data)*(.data*)PROVIDE (__data_end = .) ;} > data AT text

.bss :{PROVIDE (__bss_start = .) ;

Page 84: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 76 / 82

*(.bss)*(.bss*)PROVIDE (__bss_end = .) ;} > data

.stack :{PROVIDE (__stack_start = .) ;. = __stack_size__;} > data__stack_end = 0x800061 + 0x3F9F - 1;__data_load_start = LOADADDR(.data)>>1;__data_load_end=(__data_load_start +SIZEOF(.data))>>1;

}

Page 85: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 77 / 82

Với shellscipt trên, 2 vùng bootloader sẽ có trình tự hoạt động như hình vẽ bên dưới.

Hình 5.3: Sơ đồ hoạt động của bootloader

• Phần thứ 1 bootloader Phần này chỉ chứa vùng __startup. Thông thường, vùng này chứa đoạn mã Assembler như sau:

__startup code__sg8cc_gsinit_startup:

LJMP __sg8cc_startup__begin_user:

NOP

Page 86: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 78 / 82

Mặc định, đoạn mã Assembler này do trình biên dịch tự động sinh ra.

Lưu ý: Nhãn __begin_user dùng để bootloader kết thúc xử lý, trả lại quyền điều khiển cho user, bootloader cóthể có một hoặc nhiều chương trình user khác nhau. Vì vậy, địa chỉ bắt đầu của user do người lập trình bootloaderqui định, địa chỉ này phải nằm trong vùng có địa chỉ bắt đầu là __begin_user và địa chỉ kết thúc của nó chính làđịa bắt đầu của phần thứ 2 bootloader.

• Phần thứ 2 bootloader

– .init: Là vùng chứa đoạn mã khởi tạo giá trị ban đầu cho vùng RAM, vùng STACK và cấu hình chương trình bootloader.Vùng này là các hàm khởi động của trình biên dịch SG8-CC. Mặc định, trình biên dịch sẽ lấy các hàm này đã có trong thưviện.

– __program_main: Là vùng chứa đoạn code gọi hàm main bootloader. Ví dụ:

__program_main code__program_main:

LJMP _main

Mặc định, vùng này do trình biên dịch SG8-CC tự động sinh ra.

– Main function: Là vùng chứa chương trình chính của bootloader, được viết bằng ngôn ngữ C. Chỉ có hàm này mới quyềnchuyển quyền thực thi cho user. Nếu người dùng muốn chuyển quyền thực thi cho user có địa chỉ tuyệt đối AAA thì phải chènAssembler vào chương trình chính như sau:

void main (){

...__asm

LJMP AAA__endasm;...

}

Lưu ý: Địa chỉ AAA này là địa chỉ được tính theo word.

– other function: Là vùng chứa tất các hàm khác được gọi bởi hàm _main của bootloader, viết bằng ngôn ngữ C.

5.2.3 Cách đổi địa chỉ bắt đầu phần thứ 2 của bootloader

Mở shellscript bootcode.x, tìm đoạn code giống với đoạn mã giống như bên dưới và thay số 0x1000 thành số muốn đổi. Giátrị số muốn đổi là địa chỉ bắt đầu của phần thứ 2 của bootloader được tính theo byte (chữ in đậm).

.text 0x10000:

5.3 Quản lý vùng nhớ Flash của user tương ứng với bootloader

Để biên dịch một chương trình user tương thích với chương trình bootloader trong chip SG8V1, ta cần phải được biên dịchchương trình user này với ‘linker shellscript’ tương thích với ‘linker shellscript’ (tập tin bootcode.x).Trình biên dịch còn cung cấp một tập tin ‘linker shellscript’ mẫu dùng để biên dịch chương trình user tương thíchvới bootcode.x. Tập tin mẫu này tên user.x, nếu cài trình biên dịch tích hợp trong gói cài đặt IDE IFast thì tập tin nàynằm trong đường dẫn path_install_ifast/sg8cc/sg8/lib/ldscripts/. Khi lập trình user, người lập trình nênsao chép tập tin mẫu này đế thư mục chứa project. Cấu hình biên dịch với ‘linker shellscript’ user.x tương tự nhưbootcode.x, bằng cách nhấn ‘project→Properties’ để mở hộp thư thoại ‘Project Properties’, sau đó chọn thẻ‘Linker settings’ và điền -T user.x vào textbox ‘Other linker settings’. Tập tin user.x có nội dung nhưsau:

Page 87: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 79 / 82

OUTPUT_FORMAT("elf32-sg8")OUTPUT_ARCH(sg8)__stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 128;MEMORY{

text (rx) : ORIGIN = 0x00, LENGTH = 128Kdata (rw!x) : ORIGIN = 0x800061, LENGTH = 0x3F9F

}SECTIONS{

__startup 0x06:{*(__startup)KEEP (*(__startup))*(__startup.*)

} > text__vector_1 0x10:

{*(__vector_1)KEEP (*(__vector_1))*(__vector_1.*)

} > text__vector_2 0x20:

{*(__vector_2)KEEP (*(__vector_2))*(__vector_2.*)

} > text/* Internal text space or external memory. */.text :{*(__program_startup)*(__program_startup.*)*(.init)KEEP (*(.init))*(.init.*)*(__program_main)KEEP (*(__program_main))*(__program_main.*). = ALIGN(2);*(.text). = ALIGN(2);*(.text.*). = ALIGN(2);_etext = . ;

} > text.rodata :

{. = ALIGN(2);*(.rodata). = ALIGN(2);*(.rodata.*)

} > text.register :{*(.register)KEEP (*(.register))

} > data.data :{

PROVIDE (__data_start = .) ;

Page 88: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 80 / 82

*(.data)*(.data*)PROVIDE (__data_end = .) ;

} > data AT text

.bss :{

PROVIDE (__bss_start = .) ;*(.bss)*(.bss*)PROVIDE (__bss_end = .) ;

} > data

.stack :{

PROVIDE (__stack_start = .) ;. = __stack_size__;

} > data__stack_end = 0x800061 + 0x3F9F - 1;__data_load_start = LOADADDR(.data)>>1;__data_load_end = (__data_load_start + SIZEOF(.data))>>1;

}

Tùy thuộc vào phần thứ 1 của bootloader mà ta có thể thay đổi ‘linker shellscript’ user.x cho phù hợp, miễn là khôngxâm phạm các phần bootloader. Mặc định, vùng phần thứ 1 của bootloader có địa chỉ bắt đầu là 0x0000 và địa chỉ kết thúc là0x0004.Ví dụ: phần 1 của bootloader có kích thước mặc định là 0x4 byte, phần 2 có địa chỉ bắt đầu là 0x1C00 (tính theo byte)thì ta tìm và sửa giống như đoạn bên dưới (chữ in đậm).

...text (rx) : ORIGIN = 0x04, LENGTH = 0x1C000

...__startup 0x04:...

Lưu ý: khi viết chương trình Assembler cho bootloader và user tuyệt đối không dùng chỉ thị ORG

Page 89: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 81 / 82

Chương 6

Lưu ý khi sử dụng

• Compiler SG8V1 không hỗ trợ truyền tham số hàm kiểu struct và không hỗ trợ giá trị trả về của hàm là kiểu struct.

• Compiler SG8V1 không hỗ trợ các thư viện cấp phát động: malloc(), free(), calloc() ...

• Không sử dụng các toán tử tăng (++) hoặc giảm (–) cho một biến trong cùng một biểu thức gán (=) mà biến đó được sử dụngnhiều lần

Ví dụ

char arr[10];...arr[index++] = add10( index);...

***replace***char arr[10];...arr[index] = add10( index);...index++;

• Trong hàm xử lý ngắt (interupt handler) không được sử dụng các hàm cấu hình ngắt enable_interrupt_level/disable_interrupt_level,enable_interrupts/disable_interrupts, clear_interrupt_flags, ext_int_edge.

Page 90: Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast · 2016-07-01 · Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 1 / 82 Chương 1 Đặc tả

Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 82 / 82

Chương 7

Phụ lục

Trong tài liệu này có dùng một số từ viết tắt chuyên ngành. Mục này dùng để giải thích các từ viết tắt trên nhằm giúp đọc giảnhanh chóng hiểu được tài liệu:

UART: Universal Asynchronous Receiver Transmitter (Bộ Thu Phát Bất Đồng Bộ Toàn Hệ Thống)

I2C: Inter Intergrated-Circuit (Giao Tiếp Liên Mạch-Tích-Hợp)

SPI: Serial Peripheral Interface (Giao Tiếp Ngoại Vi Tuần Tự)

IDE: Intergrated Development Environment (Môi Trường Phát Triển Tích Hợp)

CC: Capture/Compare (Bộ Ghi và So Sánh)

PWM: Pulse-Width Modulation (Điều Chế Độ Rộng Xung).

SFR: Special Function Register (Thanh Ghi Có Chức Năng Đặc Biệt)

ADC: Analog-to-Digital Converter (Bộ chuyển đổi Tương Tự-Số)