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

Kích thước: px
Bắt đầu hiển thị từ trang:

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

Bản ghi

1 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

2 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 SG8V Chỉ thị tiền xử lý Chỉ thị tiền xử lý Chỉ thị tiền xử lý #define Các chỉ thị tiền xử lý #if, #else, #endif Các Chỉ thị tiền xử lý #ifdef và #ifndef Chỉ thị hợp ngữ Chỉ thị EQU Chỉ thị RES Chỉ thị DB Chỉ thị DW Chỉ thị DATA Chỉ thị UDATA Chỉ thị UDATA_OVR Chỉ thị ORG Chỉ thị CODE Chỉ thị EXTERN Chỉ thị GLOBAL Chỉ thị LOCAL Chỉ thị END Tập lệnh của SG8V Hướng dẫn hợp ngữ cho SG8V Biên dịch chương trình Chú thích Định danh Hằng số Định nghĩa nhãn

3 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 Cấu trúc chương trình Các thành phần cơ bản Các từ khóa Các định danh (Identifier) Hằng số Khai báo và kiểu dữ liệu Các lớp phạm vi (storage class) Kiểu dữ liệu và thuộc tính kiểu Đối tượng khai báo Khai báo cấu trúc Khai báo kiểu hợp nhất Khai báo enum Khai báo mảng Khai báo con trỏ Bộ khởi tạo Dùng typedef để định nghĩa kiểu Các biểu thức Tập lệnh Lệnh Null ; Lệnh biểu thức Lệnh break Lệnh khối Lệnh continue Lệnh if Lệnh else if Lệnh switch và case Lệnh do-while Lệnh while Lệnh for Lệnh goto và các lệnh có nhãn Lệnh return Lệnh asm, endasm Hàm Định nghĩa hàm Khai báo hàm Lệnh gọi hàm Truyền tham số Chú thích Chỉ thị tiền tiền xử lý Chỉ thị #define Các chỉ thị #if, #else, #endif Các chỉ thị #ifdef và #ifndef

4 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 Định địa chỉ tuyệt đối Các hằng số và biến tích hợp Các hàm và chỉ thị của SG8V Truy xuất cổng (sg8v1.h) Cấu hình stack Các hàm chờ (delay.h) Các ngắt (interrupt.h) Bộ định giờ (timer.h) Bộ ghi và so sánh (Capture/Compare) (timer.h) Bộ điều chế độ rộng xung PWM (timer.h) Giao tiếp SPI (spi.h) Giao tiếp I2C (i2c.h) Giao tiếp ADC (adc.h) Giao tiếp UART (usart.h hoặc stdio.h) Truy xuất vùng FLASH (flash.h) Các hàm chuỗi (string.h) Các hàm toán học (math.h) Môi trường phát triển tích hợp (IDE) IFast Giới thiệu Hướng dẫn cài đặt IFast Cài đặt IFast trên Windows Cài đặt trên Ubuntu/Debian Giao diện lập trình của IFast Các tính năng chính của IFast Quản lý Dự Án Tạo một dự án mới Mở một dự án có sẵn Đóng dự án Thêm tập tin mã nguồn vào trong dự án Quản lý Tập Tin Mở một tập tin mã nguồn có sẵn Tạo mới một tập tin nguồn Thêm tập tin có sẵn vào dự án Các thao tác trên tập tin nguồn Chức năng Tìm Kiếm, Thay Thế và Đi Tới Find (Tìm Kiếm) Find in Files(Tìm Kiếm trong các tập tin)

5 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast v Find occurences(tìm Kiếm sự xuất hiện) Replace (Thay Thế) Replace in Files (Thay Thế trong 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) Chức năng biên dịch Chức năng nạp Cấu hình trình biên dịch Cấu hình biên dịch Cấu hình trình liên kết Cấu hình đường dẫn của các trình biên dịch và trình thực thi Các cấu hình khác Cờ trình biên dịch Cấu hình chức năng tô màu cú pháp Cấu hình chức năng phím tắt Bootloader SG8V Cách viết chương trình bootloader Quản lý vùng nhớ Flash của bootloader Tổ chức vùng Flash của bootloader Tổ chức các vùng nhớ trong 2 phần bootloader Cách đổi địa chỉ bắt đầu phần thứ 2 của bootloader Quản lý vùng nhớ Flash của user tương ứng với bootloader Lưu ý khi sử dụng 81 7 Phụ lục 82

6 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) Sơ đồ bộ định giờ (timer1) Sơ đồ bộ định giờ (timer2) Sơ đồ WDT Sơ đồ khối ADC Sơ đồ khối truyền UART Sơ đồ khối nhận UART Hộp thoại chào mừng của quá trình cài đặt IFast Giao ước giữa IFast và người dùng Hộp thoại chọn thành phần cài đặt Hộp thoại chọn đường dẫn cài đặt Hộp thoại thể hiện quá trình cài đặt của IFast Hộp thoại thông báo quá trình cài đặt đã thành công Quá trình cài IFast trên Ubuntu/Debian Thông báo quá trình cài IFast trên Ubuntu/Debian thành công Giao diện IFast Giao diện tạo dự án mới Giao diện thông tin dự án Giao diện chức năng Find Giao diện chức năng Find in Files Hộp thoại Replace Hộp thoại Replace in Files Công cụ Show Function Các chức năng và tùy chọn của icprog Giao diện chức năng nạp (Build and Load) Giao diện công cụ Programming Giao diện cấu hình của công cụ Programming Hộp thoại cấu hình tính năng trình biên dịch C Hộp thoại cấu hình trình liên kết

7 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 Hộp thoại dùng cho việc cấu hình các chức năng khác Hộp thoại cấu hình chức năng tô màu cú pháp Cấu hình chức năng phím tắt Hộp thư thoại Other linker settings Sơ đồ tổ chức vùng nhớ Flash của bootloader Sơ đồ hoạt động của bootloader

8 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 Các toán tử logic Các toán tử bit và toán tử dịch Các toán tử logic Các toán tử so sánh Các toán tử gán Danh sách các ngắt Các luật định dạng được dựa theo chuẩn ANSI-C cho hàm fprintf Biểu diễn số theo các luật định dạng trong hàm fprintf

9 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ý 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ự động nối hai tập tin này lại. Cú pháp: #include <ten_tap_tin.inc> Ví dụ: #include <sg8v1.inc> 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 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_so có 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_so doan_ma_1 [#else doan_ma_2] #endif

10 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 2 / 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 định nghĩa bằng chỉ thị #define hay chưa được định nghĩa. 1.2 Chỉ thị hợp ngữ 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ẽ thay symbol này bằng giá trị tương ứng khai báo bằng chỉ thị EQU. Cú pháp: ki_hieu EQU Ví dụ: bieu_thuc length EQU 20 ; length = 20 width EQU 30 ; width = 30 area EQU length*width ;area = 20x30 = 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 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_n ki_hieu: DB bieu_thuc_1, bieu_thuc_2,..., bieu_thuc_n Ví dụ: var DB 20 ; var = 20 array DB 2,8,5 ; array + 1 = 2 ; array + 2 = 8 ; array + 3 = 5

11 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 3 / 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ích thước tương đương 2 byte. Cú pháp: ki_hieu DW bieu_thuc_1, bieu_thuc_2,..., ki_hieu: DW bieu_thuc_1, bieu_thuc_2,..., bieu_thuc_n bieu_thuc_n Ví dụ: var DW 30 ; var = 30 array DW 2,8,5; array + 1 = 2 ; array + 3 = 8 ; array + 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ẽ đều nằ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 DATA var DB 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ẽ đều nằ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ê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ụ: uninitialized_data UDATA var RES 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 so vớ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 chung mộ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 đượ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ụ:

12 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 0x61 var1 RES 1 ; var1 co đia chi vung nho la 0x5c var2 RES 1 ; var2 co đia chi vung nho la 0x5d var3 RES 2 ; var3 co đia chi vung nho la 0x5e var4 RES 2 ; var4 co đia chi vung nho la 0x60 overlay_data UDATA_OVR 0x61 ; vung nay bat đau tu 0x61 var5 RES 1 ; var5 dung chung vung nho voi var1 var6 RES 3 ; var6 dung chung vung nho voi var2 va var3 var7 RES 2 ; var7 dung chung vung nho voi var 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ịch nhiều file với linker để tạo mã máy. Cú pháp: bieu_thuc ORG dia_chi_trong_ram 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ùng một tập tin mã nguồn thì không được trùng tên 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 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áo bằng từ khóa EXTERN đã đề cập ở mục trên. Cú pháp: GLOBAL bieu_thuc Ví dụ: GLOBAL global_function

13 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 5 / 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 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 SG8V 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.o sg8-ld output_file.o -o output_file.elf sg8-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 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ới mã 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

14 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 6 / Đị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ơn 26 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 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ười dù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 Đị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án vị 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.

15 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ên dị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 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óa nà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.

16 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; 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ình phả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]* 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 Trong đó danh_sach_doi_tuong_khai_bao-khoi_tao; Cac_dac_ta_khai_bao: [lop_pham_vi] [thuoc_tinh_kieu_du_lieu] kieu_du_lieu

17 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_tao hoac doi_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 //hoac doi_tuong_khai_bao = gia_tri_khoi_tao Các lớp phạm vi (storage class) Các từ khóa trong lớp phạm vi (lop_pham_vi) là: static extern typedef 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òn lại được xem như là biến cục bộ (local) 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/unsigned) 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ệu riê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ác kiể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 (kiểu unsigned) và từ đến 32767(kiểu signed) long Kích thước 32 bit, giới hạn từ 0 đến (kiểu unsigned) và từ đến (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ịch sẽ 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ải thô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.

18 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 10 / Đố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_danh dinh_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ượng thì 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 đối tượ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 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; 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át vù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 {

19 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ướt là 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ới kích thướt của window 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ột trong 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ằng 1 đơn vị (DOWN bằng 1, RIGHT bằng 2, LEFT bằng 3) 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 được xem 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ác vị 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]; 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ất chỉ 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.

20 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 12 / 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ạng tổ 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át sinh 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ết thúc chuỗi 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ạo ra 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úc club. 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 định mộ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ác dấ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ác toán tử được định nghĩa như sau:

21 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. * & (type) Toán tử gián tiếp truy xuất một giá trị một cách gián tiếp thông qua một con trỏ Toán tử địa chỉ cung cấp địa chỉ toán hạng của nó Toán tử ép kiểu. Không được hỗ trợ địa chỉ của biến kiểu bit 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ểu Không hỗ trợ cộng 2 con trỏ (p + dấu chấm động (f) hoặc một 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ểu Không hỗ trợ cộng 2 con trỏ (p - dấu chấm động (f) hoặc một 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

22 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ên trá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êu tả tập lệnh được trình biên dịch hỗ trợ 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: ; 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 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; 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ấu thà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 } 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ệnh còn lại trong phần thân của vòng lặp này. continue;

23 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 15 / 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 ) lenh hoac if ( bieu_thuc ) lenh else lenh Lệnh else if if ( bieu_thuc_1 ) lenh_1 else if ( bieu_thuc_2 ) lenh_2... else if ( bieu_thuc_n-1 ) lenh_n-1 else 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ực hiện lenh_n 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_1 case bieu_thuc_hang_so_2 : danh_sach_lenh_2... case bieu_thuc_hang_so_n-1 : danh_sach_lenh_n-1 default: 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ành danh_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úc hàm switch 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 ít nhất một lần.

24 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 16 / 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 continue trong 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 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 thi hà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ởi tạ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 continue trong 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 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ới mộ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 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ị cho hà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 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ác biến toàn cục cho các lệnh hợp ngữ này. asm Cac_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 chi tiết).

25 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 17 / 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àm thườ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 khai báo, định nghĩa một hàm và cách gọi các hàm Đị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ần thâ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à: null khai_bao_tham_so khai_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ủa mộ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 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 Trong đó: doi_tuong_ khai_bao_ham là: doi_tuong_ khai_bao_ham; dinh_danh( danh_sach_tham_so) danh_sach_tham_so là: null khai_bao_tham_so khai_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ấu chấ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 );

26 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 18 / 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 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ết vị 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 con trỏ 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. Tham số 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... */ hoac lenh; // chu thich 2.8 Chỉ thị tiền tiền xử lý 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_tu hoac #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ằng chuoi_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 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_so có 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.

27 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 19 / 82 #if bieu_thuc_hang_so doan_ma_1 [#else doan_ma_2] #endif 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.

28 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 0x0003 typedef 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 tin sg8v1.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;

29 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 INT_TIMER0 INT_TIMER1 Timers Thanh ghi timer bị tràn INT_TIMER2 INT_TIMER3 Ngắt ngoài CC UART1 UART2 UART3 I2C SPI ADC Giá trị các chân ngắt ngoại vi thay đổi Compare hoặc Capture Truyền dữ liệu khi bộ đệm dữ liệu rỗng Nhận dữ liệu khi bộ đệm dữ liệu đầy Truyền dữ liệu khi bộ đệm dữ liệu rỗng Nhận dữ liệu khi bộ đệm dữ liệu đầy Truyền dữ liệu khi bộ đệm dữ liệu rỗng Nhận dữ liệu khi bộ đệm dữ liệu đầy Truyền hoặc nhận dữ liệu Xung đột bus dữ liệu Truyền hoặc nhận dữ liệu Chuyển đổi tín hiệu từ AC sang DC. INT_EXT0 INT_EXT1 INT_EXT2 INT_EXT3 INT_CC INT_TBE1 INT_RDA1 INT_TBE2 INT_RDA2 INT_TBE3 INT_RDA3 INT_I2C INT_BUSCOL INT_SPI INT_ADC Bảng 3.1: Danh sách các ngắt 3.3 Các hàm và chỉ thị của SG8V 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);

30 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ột châ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áo thành các hằng số tích hợp 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 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ằm trong khoảng từ đến ( 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ói cá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ờ.

31 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 23 / 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); //and void 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ằng số 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/PER IPHERAL/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óa từng ngắt riêng rẽ mà ta chọn bằng cách dùng hai hàm sau: void enable_interrupts(interrupts); //and void 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

32 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_xxxx handler_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_xxxx chỉ 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_timer0 void 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ục vụ 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ấp tươ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 high void 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

33 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 theo thứ 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ùy chọ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 cao lẫ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ác ngắ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ấp thì 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ước trong 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ía trê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)

34 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ên thì 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àm là 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ùng hà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ến toà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_interrupts và 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ắt khi thay đổi biến timer thì phải viết như sau: volatile int timer; #int_timer3 void 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 đảm bả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.

35 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àm khá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 trong tất cả các handler ngắt 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();

36 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:

37 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ày vô 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ành cho timer2. Cấu hình WDT: void setup_wdt(mode); Hình 3.4: Sơ đồ WDT 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ột giá 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(); 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),

38 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ằng mộ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(); 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ần dù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 được tả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 bit DIRC[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.

39 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ấu hì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ấu hì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 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. Ví dụ: Lưu ý: Hàm này sẽ phải thiết lập bit SPICON bằng một. spi_setup(spi_master SPI_HIGH SPI_CLK_DIV_64); //or spi_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ép truyề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 as spi_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.

40 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 32 / 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ột hà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.

41 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 33 / 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);

42 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àm adc_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ếu hà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 qua hà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ối ADC thì dùng hàm adc_open Giao tiếp UART (usart.h hoặc stdio.h) Hình 3.6: Sơ đồ khối truyền UART

43 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ép sử 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ước khi 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ân cá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 độ 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ặc nhiề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:

44 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 datasheet SG8V1 để 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 SG8V1 thông qua CPU_CLK. Ví dụ: #include <usart.h>... #define CPU_CLK 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ến rs232_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ặ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ày thông qua biến rs232_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):

45 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ùng vớ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ười dù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ình UART 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ận cô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ự LF end 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ày thô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ằng khô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); //or void printf(format_string, values...);

46 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 tham số 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 b u d s Lu Ld x X Lx LX f Character Bit Unsigned int Sign int String Long unsigned int Long signed int Hex int (lower case) Hex int (upper case) Hex long int (lower case) Hex long int (upper case) 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 %03u %u %2u 18 * (undefine) %d 18-2 %x 12 fe %X 12 FE %4X FE 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); //or void 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 tham số 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); //or void 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 tham số 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:

47 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 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ình ngườ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ấu hì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ó địa chỉ 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ào vù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, , nói cá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

48 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, , nói cá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ó địa chỉ 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àm nà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 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 *);

49 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); 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);

50 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 trong việ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át triể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ều chứ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ại ngô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ột bộ 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ất cả người dùng.

51 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 43 / Hướng dẫn cài đặt IFast 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

52 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

53 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ên desktop 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

54 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.

55 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

56 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, IFast sẽ được khởi động ngay lập tức 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 Debian 6 (32bit), tên tập tin này là ifast-debian bit.run. Gõ lệnh./ ifast-debian bit.run để bắt đầu thực hiện cài đặt.

57 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 đặt thà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 quen vớ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

58 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ể tham khả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ập trì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ằng mộ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ập tin 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ủa cá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ăng cầ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ệt kê ở đâ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ới nhiều hàm/biến.

59 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ương trì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ồm cá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ăng hiệ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ác khố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 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ác cấ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ổ IFast riêng biệt.

60 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 52 / 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 New Project 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ự

61 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 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ó Đó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ưu thì 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 hay khô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ẻ Project của khối Management và chọn Close 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ười sử 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à:

62 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 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 vi xử 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ùng thê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óa bằng một thẻ trên khối Editor 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 An Exisitng 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 tin mong 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 Project củ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ích hợp trong IFast 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 ra mộ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ới theo 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 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 Open files 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 đường dẫn của tập tin cần thêm vào 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)

63 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 cho từ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) 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ụng có thể dùng các tùy chọn được hỗ trợ. Hộp thoại Find như sau.

64 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 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ủa quá 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ác tù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 tin cầ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)

65 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 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) trong phạ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ất ra trong khối Log & Others 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:

66 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 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ặc kí 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:

67 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 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ần di 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

68 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 60 / 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/Implementation hoặc sử dụng phím tắt 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 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ác tậ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/Header tươ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ím tắ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ướng ban đầ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ới yê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.

69 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 61 / 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ạp tậ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 đặt vớ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ức nă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ủa chứ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 giao diệ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ơn củ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ý

70 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 Programming Giao 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 đỏ)

71 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 tin Tê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.

72 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 64 / 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ình biê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ằng cách chọn trình biên dịch thích hợp trong khung Selected Compiler.

73 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 65 / 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ình biên dịch mà người sử dụng chọn. Để hiểu thêm về các cờ, xem Section Hình 4.21: Hộp thoại cấu hình tính năng trình biên dịch C 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ên dị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

74 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ình mong 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 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ủa nhữ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

75 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

76 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 68 / 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 linh tinh 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 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à:

77 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 SG8V1 Cờ 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ình dị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

78 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 quan trọ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ải truy 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

79 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ức nă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ầu ngườ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

80 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ương trì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ì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 bootloader. Tập tin mẫu nà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ẫu nà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ộp thư thoại Project Properties, sau đó chọn thẻ Linker settings và điền -T bootcode.x vào textbox Other linker 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.

81 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 73 / Quản lý vùng nhớ Flash của bootloader 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.

82 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ằng begin_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 qua shellscipt bootcode.x.

83 Hướng dẫn sử dụng trình biên dịch SG8-CC & IDE IFast 75 / 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 = 128k data (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 =.) ;

84 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 = 0x x3F9F - 1; data_load_start = LOADADDR(.data)>>1; data_load_end=( data_load_start +SIZEOF(.data))>>1;

85 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

Lập trình và ngôn ngữ lập trình

Lập trình và ngôn ngữ lập trình Lập trình và ngôn ngữ lập trình Nội dung Thế nào là lập trình Ngôn ngữ lập trình Ngôn ngữ C và C++ Xây dựng một chương trình đơn giản Lập trình (programming) Các thao tác xây dựng chương trình máy tính

Chi tiết hơn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 5. Kiểu dữ liệu và biểu thức trong C Nội dung 1. Các ki

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 5. Kiểu dữ liệu và biểu thức trong C Nội dung 1. Các ki TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 5. Kiểu dữ liệu và biểu thức trong C Nội dung 1. Các kiểu dữ liệu chuẩn trong C 2. Khai báo và khởi tạo biến,

Chi tiết hơn

Những cơ sở của ngôn ngữ C# Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệ

Những cơ sở của ngôn ngữ C# Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệ Những cơ sở của ngôn ngữ C# Bởi: phamvanviet truonglapvy Trong chương này sẽ trình bày về hệ thống kiểu trong C#; phân biệt kiểu dựng sẵn (int,long,bool, ) với các kiểu do người dùng định nghĩa. Ngoài

Chi tiết hơn

Câu lệnh (statement) Câu lệnh (statement) Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu

Câu lệnh (statement) Câu lệnh (statement) Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu Bởi: Khuyet Danh Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu lệnh tuần tự với nhau. Mỗi câu lệnh phải kết thúc với một dấu chấm phẩy, ví dụ như: int x; //

Chi tiết hơn

Microsoft Word - bo_tien_xu_ly_trong_c.docx

Microsoft Word - bo_tien_xu_ly_trong_c.docx Bộ tiền xử lý trong C Bộ tiền xử lý trong C ở đây không phải là một phần của bộ biên dịch, nhưng có những bước riêng rẽ trong quá trình biên dịch. Theo cách hiểu cơ bản nhất, bộ tiền xử lý trong ngôn ngữ

Chi tiết hơn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 13. Hàm Nội dung 1. Khái niệm hàm 2. Khai báo và sử dụn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 13. Hàm Nội dung 1. Khái niệm hàm 2. Khai báo và sử dụn TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 13. Hàm Nội dung 1. Khái niệm hàm 2. Khai báo và sử dụng hàm 3. Phạm vi của biến 2 1 Nội dung 1. Khái niệm

Chi tiết hơn

TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc

TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc TRƯỜnG ĐẠI HỌC BÁCH KHOA HÀ nội VIỆn CÔnG nghệ THÔnG TIn VÀ TRUYỀn THÔnG TIN HỌC ĐẠI CƯƠNG Bài 10. Các cấu trúc lập trình trong C Nội dung 1. Cấu trúc lệnh khối 2. Cấu trúc rẽ nhánh 2.1. Cấu trúc if, if

Chi tiết hơn

NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh

NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh NGÔN NGƯ LÂ P TRIǸH Biên tập bởi: nguyenvanlinh Các tác giả: unknown Phiên bản trực tuyến: http://voer.edu.vn/c/7a0aeef9 MỤC LỤC 1. Tổng quan Ngôn ngữ lập

Chi tiết hơn

Chương II - KIẾN TRÚC HỆ ĐIỀU HÀNH

Chương II -  KIẾN TRÚC HỆ ĐIỀU HÀNH I Mục đích HỆ THỐNG TẬP TIN Sau khi học xong chương này, người học nắm được những kiến thức sau: Hiểu các khía cạnh khác nhau của tập tin và cấu trúc thư mục Hiểu các cơ chế quản lý, kiểm soát, bảo vệ

Chi tiết hơn

Hàm và lớp template trong Lập trình hướng đối tượng Hàm và lớp template trong Lập trình hướng đối tượng Bởi: unknown Trong phần này, chúng ta tìm hiểu

Hàm và lớp template trong Lập trình hướng đối tượng Hàm và lớp template trong Lập trình hướng đối tượng Bởi: unknown Trong phần này, chúng ta tìm hiểu Hàm và lớp template trong Lập trình hướng đối tượng Bởi: unknown Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++, đó là template (khuôn mẫu). Các template cho phép chúng ta

Chi tiết hơn

Chương trình dịch

Chương trình dịch TIN HỌC ĐẠI CƯƠNG Bài 4: Vòng lặp trong C++ (phần 1) Nội dung chính 1. Tại sao cần viết chương trình con? 2. Vòng lặp 3. Ví dụ về vòng lặp dùng biến đếm 4. Ví dụ về vòng lặp dùng điều kiện 5. Biểu thức

Chi tiết hơn

Chương 1:

Chương 1: GIÁO TRÌNH CẤU TRÚC DỮ LIỆU - 2003 - Lời nói đầu Cấu trúc dữ liệu là môn học chính yếu của chuyên ngành Công nghệ thông tin, là kiến thức nền tảng cho những người lập trình. Nhằm xây dựng một giáo trình

Chi tiết hơn

Template and Exception Template and Exception Bởi: Thanh Hiền Vũ TEMPLATE Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++,

Template and Exception Template and Exception Bởi: Thanh Hiền Vũ TEMPLATE Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++, Bởi: Thanh Hiền Vũ TEMPLATE Trong phần này, chúng ta tìm hiểu về một trong các đặc tính còn lại của C++, đó là template (khuôn mẫu). Các template cho phép chúng ta để định rõ, với một đoạn mã đơn giản,

Chi tiết hơn

Các biến và các kiểu dữ liệu trong JavaScript Các biến và các kiểu dữ liệu trong JavaScript Bởi: Hà Nội Aptech Các biến (Variables) Biến là một tham c

Các biến và các kiểu dữ liệu trong JavaScript Các biến và các kiểu dữ liệu trong JavaScript Bởi: Hà Nội Aptech Các biến (Variables) Biến là một tham c Các biến và các kiểu dữ liệu trong JavaScript Bởi: Hà Nội Aptech Các biến (Variables) Biến là một tham chiếu đến một vị trí trong bộ nhớ. Nó dùng để chứa các giá trị có thể thay đổi khi script đang được

Chi tiết hơn

PowerPoint Presentation

PowerPoint Presentation Chủ đề 3: Cấu trúc điều khiển Sử dụng các điều kiện chọn, điều kiện lặp và kỹ thuật include mã nguồn của PHP để tăng tính gọn nhẹ cho hệ thống. PHP MySQL Jun 2013 Lương Vĩ Minh Copyright 2013 - Khoa Công

Chi tiết hơn

Tìm hiểu ngôn ngữ lập trình Visual Basic Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tìm hiểu ngôn ngữ lập trình Visual Basic Tổng quan

Tìm hiểu ngôn ngữ lập trình Visual Basic Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tìm hiểu ngôn ngữ lập trình Visual Basic Tổng quan Tìm hiểu ngôn ngữ lập trình Visual Basic Bởi: Khuyet Danh Tổng quan về ngôn ngữ lập trình Visual Basic Visual Basic, con đường nhanh nhất và đơn giản nhất để tạo những ứng dụng cho Microsoft Windows. Bất

Chi tiết hơn

Nhúng mã-cách khai báo biến Nhúng mã-cách khai báo biến Bởi: Khoa CNTT ĐHSP KT Hưng Yên Nhúng mã javascript trong trang HTML Bạn có thể nhúng JavaScri

Nhúng mã-cách khai báo biến Nhúng mã-cách khai báo biến Bởi: Khoa CNTT ĐHSP KT Hưng Yên Nhúng mã javascript trong trang HTML Bạn có thể nhúng JavaScri Nhúng mã-cách khai báo biến Bởi: Khoa CNTT ĐHSP KT Hưng Yên Nhúng mã javascript trong trang HTML Bạn có thể nhúng JavaScript vào một file HTML theo một trong các cách sau đây: Sử dụng các câu lệnh và các

Chi tiết hơn

ĐHQG TPHCM ĐH Bách Khoa Khoa Đ-ĐT BM Điện Tử Điểm Đáp án của Đề kiểm tra giửa HK 2 NH: Môn: Vi xử lý Mã MH: Ngày thi: 20/03/2013 Thời

ĐHQG TPHCM ĐH Bách Khoa Khoa Đ-ĐT BM Điện Tử Điểm Đáp án của Đề kiểm tra giửa HK 2 NH: Môn: Vi xử lý Mã MH: Ngày thi: 20/03/2013 Thời ĐHQG TPHCM ĐH Bách Khoa Khoa Đ-ĐT BM Điện Tử Điểm Đáp án của Đề kiểm tra giửa HK 2 NH: 2012-2013 Môn: Vi xử lý Mã MH: 402030 Ngày thi: 20/03/2013 Thời gian làm bài: 80 phút Đề có 4 trang và SV làm trực

Chi tiết hơn

Microsoft Word - TUT02.01.PVN.NTCR doc

Microsoft Word - TUT02.01.PVN.NTCR doc Ngày: 1/30/2006 Trang: 1/18 Tutorial 02.02 Gửi đến: Nội dung: picvietnam@googlegroups.com Hàm Delay MICROSOFT WORD Tóm tắt: Tutorial post lên picvietnam, topic PIC16F877A TỪ DỄ TỚI KHÓ thuộc luồng CƠ BẢN

Chi tiết hơn

Modbus RTU - Modbus TCP/IP Converter

Modbus RTU - Modbus TCP/IP Converter BỘ CHUYỂN ĐỔI MODBUS RTU - MODBUS TCP/IP 1/20/2019 Hướng dẫn sử dụng CÔNG TY CỔ PHẦN GIẢI PHÁP KỸ THUẬT ẤN TƯỢNG Địa chỉ: 60 Đường số 1 P.Tân Thành Q.Tân Phú Tp.HCM Việt Nam Phone: 028.3842.5226 (Phím

Chi tiết hơn

XJ-UT311WN_XJ-UT351WN

XJ-UT311WN_XJ-UT351WN MÁY CHIẾU DỮ LIỆU VI Hướng Dẫn Chức Năng Mạng Phải đọc Phòng Ngừa An Toàn và Biện Pháp Phòng Ngừa khi Vận Hành trong tài liệu Hướng Dẫn Người Sử Dụng, và chắc chắn rằng bạn phải sử dụng sản phẩm này đúng

Chi tiết hơn

Chuyển đổi tương tự - số photonic bằng cách dùng buồng cộng hưởng Fabry- Perot phi tuyến Chuyển đổi tương tự - số song song về mặt không gian được đề

Chuyển đổi tương tự - số photonic bằng cách dùng buồng cộng hưởng Fabry- Perot phi tuyến Chuyển đổi tương tự - số song song về mặt không gian được đề Chuyển đổi tương tự - số photonic bằng cách dùng buồng cộng hưởng Fabry- Perot phi tuyến Chuyển đổi tương tự - số song song về mặt không gian được đề xuất với buồng cộng hưởng Fabry- Perot phi tuyến được

Chi tiết hơn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 9. Vào ra dữ liệu trong C Các lệnh vào ra dữ liệu C cun

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 9. Vào ra dữ liệu trong C Các lệnh vào ra dữ liệu C cun TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 9. Vào ra dữ liệu trong C Các lệnh vào ra dữ liệu C cung cấp 2 hàm vào ra cơ bản: printf() scanf() Muốn sử

Chi tiết hơn

UART0

UART0 UART Cổng truyền thông bất đồng bộ nối tiếp --ф ф Các đề mục chính: A. Chức năng: --------------------------------------------------------------------------------------------------------------3 B. Diễn

Chi tiết hơn

OpenStax-CNX module: m Giới thiệu về ngôn ngữ C và môi trường turbo C 3.0 ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licens

OpenStax-CNX module: m Giới thiệu về ngôn ngữ C và môi trường turbo C 3.0 ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licens OpenStax-CNX module: m30475 1 Giới thiệu về ngôn ngữ C và môi trường turbo C 3.0 ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribution License 3.0

Chi tiết hơn

Hướng dẫn Board ISD9160 Vr2.1 HƯỚNG DẪN SỬ DỤNG BOARD ISD9160 Công ty TNHH Giải pháp TULA( & Tập đoàn Công nghệ Nuvoton( P

Hướng dẫn Board ISD9160 Vr2.1 HƯỚNG DẪN SỬ DỤNG BOARD ISD9160 Công ty TNHH Giải pháp TULA(  & Tập đoàn Công nghệ Nuvoton(  P HƯỚNG DẪN SỬ DỤNG BOARD ISD9160 Công ty TNHH Giải pháp TULA(www.tula.vn) & Tập đoàn Công nghệ Nuvoton(www.nuvoton.com) Page 1 MỤC LỤC Contents 1. Giới thiệu chip ISD9160... 3 2. Mạch ISD9160 demo Vr1.0...

Chi tiết hơn

Lập trình cấu trúc trong Visual Basic Lập trình cấu trúc trong Visual Basic Bởi: Nguyễn Sơn Học xong chương này, sinh viên phải nắm bắt được các vấn đ

Lập trình cấu trúc trong Visual Basic Lập trình cấu trúc trong Visual Basic Bởi: Nguyễn Sơn Học xong chương này, sinh viên phải nắm bắt được các vấn đ Lập trình cấu trúc trong Visual Basic Bởi: Nguyễn Sơn Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau: - Sử dụng môi trường lập trình VB để viết mã lệnh. - Các kiểu dữ liệu trong VB. -

Chi tiết hơn

Microsoft Word - jsp_syntax.docx

Microsoft Word - jsp_syntax.docx Cú pháp trong JSP Chương này trình bày về cú pháp đơn giản (ví dụ: các phần tử) liên quan tới lập trình JSP. Scriptlet trong JSP Scriptlet có thể chứa bất kỳ số lượng lệnh, biến, khai báo phương thức hoặc

Chi tiết hơn

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH KHOA ĐIỆN ĐIỆN TỬ Ngành đào tạo: Điện Tử Công Nghiệp Trình độ đào tạo: Đại học Chương trình đào tạo: C

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH KHOA ĐIỆN ĐIỆN TỬ Ngành đào tạo: Điện Tử Công Nghiệp Trình độ đào tạo: Đại học Chương trình đào tạo: C TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HỒ CHÍ MINH KHOA ĐIỆN ĐIỆN TỬ Ngành đào tạo: Điện Tử Công Nghiệp Trình độ đào tạo: Đại học Chương trình đào tạo: Công Nghệ Kỹ Thuật Điện Tử Truyền Thông Đề cương chi

Chi tiết hơn

Kiểu dữ liệu văn bản Kiểu dữ liệu văn bản Bởi: PGS. TS. NGƯT Phạm Văn Huấn Ngoài những dữ liệu số như các số nguyên, số thực, máy tính còn có thể lưu

Kiểu dữ liệu văn bản Kiểu dữ liệu văn bản Bởi: PGS. TS. NGƯT Phạm Văn Huấn Ngoài những dữ liệu số như các số nguyên, số thực, máy tính còn có thể lưu Bởi: PGS. TS. NGƯT Phạm Văn Huấn Ngoài những dữ liệu số như các số nguyên, số thực, máy tính còn có thể lưu giữ và xử lý những dữ liệu văn bản như những chữ cái, những đoạn văn bản, những chữ số và một

Chi tiết hơn

OpenStax-CNX module: m Lập trình hàm ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribu

OpenStax-CNX module: m Lập trình hàm ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribu OpenStax-CNX module: m30662 1 Lập trình hàm ThS. Nguyễn Văn Linh This work is produced by OpenStax-CNX and licensed under the Creative Commons Attribution License 3.0 1 TỔNG QUAN 1.1 Mục tiêu Sau khi học

Chi tiết hơn

Chương trình dịch

Chương trình dịch NHẬP MÔN TƯ DUY TÍNH TOÁN Bài 5: Kiểu tuần tự trong python, phần 2 Tóm tắt nội dung bài trước Có nhiều kiểu dữ liệu tuần tự trong python (string, list, tuple, range, bytes, ) Chứa các dữ liệu con bên trong

Chi tiết hơn

Bài 1:

Bài 1: Bài 1: LÀM QUEN THIẾT BỊ THÍ NGHIỆM 1.1 Lập dự án với S7-1200: Tạo mới dự án, mở dự án đã có. Khởi động chương trình STEP 7 Basic: Double click lên icon trên desktop hoặc vào menu start >> All Program

Chi tiết hơn

Lkgjlfjq?etyuiiofjkfjlsfjkslddghdgertt

Lkgjlfjq?etyuiiofjkfjlsfjkslddghdgertt VI XỬ LÝ Khoa: Điện Điện Tử Bộ môn: Kỹ Thuật Máy Tính Giảng viên: Trần Thiên Thanh THÔNG TIN CHUNG MÔN HỌC Thời gian: 15 tuần 60 tiết Lý Thuyết: 45 tiết 11 tuần Bài tập-thực hành: 15 tiết 03 tuần Điểm

Chi tiết hơn

Slide 1

Slide 1 Bài 2 NHẬP VÀ MỞ CÁC TỆP DỮ LIỆU 1. Khái niệm về biến và các giá trị trong biến 2. Phương pháp định biến trong SPSS 3. Nhập dữ liệu 4. Mở các tệp dữ liệu 5. Hợp nhất các tập dữ liệu (Merge files) 6. Hiệu

Chi tiết hơn

Bài tập thực hành Chuyên đề 1 CNPM - Java Khoa CNTT- Trường ĐH Công nghệ TP.HCM Lab 01: LẬP TRÌNH JAVA CƠ BẢN VỚI NET BEANS A. MỤC TIÊU: Hướng dẫn tải

Bài tập thực hành Chuyên đề 1 CNPM - Java Khoa CNTT- Trường ĐH Công nghệ TP.HCM Lab 01: LẬP TRÌNH JAVA CƠ BẢN VỚI NET BEANS A. MỤC TIÊU: Hướng dẫn tải Bài tập thực hành Chuyên đề 1 CNPM - Java Lab 01: LẬP TRÌNH JAVA CƠ BẢN VỚI NET BEANS A. MỤC TIÊU: Hướng dẫn tải và cài đặt Java, Netbeans Sử dụng NetBeans viết ứng dụng: Tạo/mở project, sao chép, biên

Chi tiết hơn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Mảng và xâu kí tự Nội dung 1. Mảng 2. Xâu kí tự 2 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Mảng và xâu kí tự Nội dung 1. Mảng 2. Xâu kí tự 2 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Mảng và xâu kí tự Nội dung 1. Mảng 2. Xâu kí tự 2 1 Nội dung 1. Mảng 1.1. Khái niệm mảng 1.2. Khai báo

Chi tiết hơn

Chương trình dịch

Chương trình dịch Linux và Phần mềm Mã nguồn mở Bài 4: Người dùng, phân quyền và quản lý file trên linux Nhắc lại và chú ý Các chế độ làm việc của hệ điều hành linux Phiên làm việc (login làm việc logout) Các thông tin

Chi tiết hơn

Chương trình dịch

Chương trình dịch NHẬP MÔN TƯ DUY TÍNH TOÁN Bài 2: Ngôn ngữ lập trình python Tóm tắt nội dung bài trước Khái niệm tư duy tính toán : phân rã bài toán, nhận mẫu, trừu tượng hóa, thiết kế thuật giải Khái niệm thuật toán Đặc

Chi tiết hơn

Trường ĐHBK Hà Nội Khoa Điện Bộ môn Điều khiển Tự động Tài liệu hướng dẫn thực hành: KĨ THUẬT LẬP TRÌNH C/C++ Bài 1: Lập trình cơ sở 1 Mục đích bài th

Trường ĐHBK Hà Nội Khoa Điện Bộ môn Điều khiển Tự động Tài liệu hướng dẫn thực hành: KĨ THUẬT LẬP TRÌNH C/C++ Bài 1: Lập trình cơ sở 1 Mục đích bài th Bài 1: Lập trình cơ sở Giúp học viên làm quen với công cụ lập trình Visual C++, thử nghiệm viết chương trình theo phong cách hướng hàm, qua đó nắm vững các kiến thức lập trình cơ sở như: 1) Phương pháp

Chi tiết hơn

Microsoft Word - TaiLieuTNKTD1PhanPLC-05[1].2008.doc

Microsoft Word - TaiLieuTNKTD1PhanPLC-05[1].2008.doc TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN ĐIỆN TỬ PHÒNG THÍ NGHIỆM KỸ THUẬT ĐIỆN 1 Tài Liệu: HƯỚNG DẪN THÍ NGHIỆM KỸ THUẬT ĐIỆN I (Phần PLC) Biên soạn: Phòng TN Kỹ Thuật Điện (B3) TP. HỒ CHÍ MINH, THÁNG 9 NĂM

Chi tiết hơn

BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HO C MA Y TI NH KHOA: CÔNG NGHỆ THÔNG TIN BÀI GIẢNG KỸ THUẬT LẬP TRÌNH C TÊN HỌC PHẦN : KỸ

BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HO C MA Y TI NH KHOA: CÔNG NGHỆ THÔNG TIN BÀI GIẢNG KỸ THUẬT LẬP TRÌNH C TÊN HỌC PHẦN : KỸ BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HO C MA Y TI NH KHOA: CÔNG NGHỆ THÔNG TIN BÀI GIẢNG KỸ THUẬT LẬP TRÌNH C TÊN HỌC PHẦN : KỸ THUẬT LẬP TRÌNH C MÃ HỌC PHẦN : 17206 TRÌNH ĐỘ ĐÀO

Chi tiết hơn

Chương trình dịch

Chương trình dịch CHƯƠNG TRÌNH DỊCH BÀI 1: NHẬP MÔN Nội dung 1. Giới thiệu môn học 2. Khái niệm chương trình dịch 3. Cấu trúc một chương trình dịch 4. Hệ thống dịch vs Chương trình dịch 5. Chương trình dịch trong thực tế

Chi tiết hơn

TRƯỜNG ĐẠI HỌC KINH TẾ TP

TRƯỜNG ĐẠI HỌC KINH TẾ TP TRƯỜNG ĐẠI HỌC KINH TẾ TP.HCM KHOA NGÂN HÀNG CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh phúc Số: 63/ĐHKT-NGHG TP. Hồ Chí Minh, ngày 18 tháng 7 năm 2019 CHƯƠNG TRÌNH THỰC TẬP TỐT NGHIỆP Khóa

Chi tiết hơn

Bài 7. Con trỏ Mục tiêu: 1. Luyện tập sử dụng con trỏ và địa chỉ của các biến 2. Sử dụng con trỏ khi thao tác với mảng. Giới hạn: không dùng các thư v

Bài 7. Con trỏ Mục tiêu: 1. Luyện tập sử dụng con trỏ và địa chỉ của các biến 2. Sử dụng con trỏ khi thao tác với mảng. Giới hạn: không dùng các thư v Bài 7. Con trỏ Mục tiêu: 1. Luyện tập sử dụng con trỏ và địa chỉ của các biến 2. Sử dụng con trỏ khi thao tác với mảng. Giới hạn: không dùng các thư viện stl (chẳng hạn vector, algorithm) Yêu cầu nộp bài

Chi tiết hơn

Lớp đối tượng String Lớp đối tượng String Bởi: Khuyet Danh Ngôn ngữ C# hỗ trợ khá đầy đủ các chức năng của kiểu chuỗi mà chúng ta có thể thấy được ở c

Lớp đối tượng String Lớp đối tượng String Bởi: Khuyet Danh Ngôn ngữ C# hỗ trợ khá đầy đủ các chức năng của kiểu chuỗi mà chúng ta có thể thấy được ở c Bởi: Khuyet Danh Ngôn ngữ C# hỗ trợ khá đầy đủ các chức năng của kiểu chuỗi mà chúng ta có thể thấy được ở các ngôn ngữ lập trình cấp cao khác. Điều quan trọng hơn là ngôn ngữ C# xem những chuỗi như là

Chi tiết hơn

Array, Indexer và Collection Array, Indexer và Collection Bởi: phamvanviet truonglapvy Mảng (Array) Mảng là một tập hợp các phần tử có cùng kiểu, được

Array, Indexer và Collection Array, Indexer và Collection Bởi: phamvanviet truonglapvy Mảng (Array) Mảng là một tập hợp các phần tử có cùng kiểu, được Bởi: phamvanviet truonglapvy Mảng (Array) Mảng là một tập hợp các phần tử có cùng kiểu, được xác định vị trí trong tập hợp bằng chỉ mục. C# cung cấp những dạng cú pháp dạng đơn giản nhất cho việc khai

Chi tiết hơn

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Tệp tin Nội dung 1. Khái niệm cơ bản 2. Các thao tá

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Tệp tin Nội dung 1. Khái niệm cơ bản 2. Các thao tá TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG TIN HỌC ĐẠI CƯƠNG Bài 11. Tệp tin Nội dung 1. Khái niệm cơ bản 2. Các thao tác với tệp tin 3. Truy nhập tệp văn bản 4. Truy nhập

Chi tiết hơn

Microsoft Word - Phan 1 - Kien thuc co so IFS-HANU 2011.doc

Microsoft Word - Phan 1 - Kien thuc co so IFS-HANU 2011.doc DISCOVERING COMPUTERS KIẾN THỨC CĂN BẢN VỀ MÁY TÍNH Phùng Văn Đông Trường Đại học Hà Nội 2011 TÀI LIỆ U THAM KHẢ O MỤC LỤC Chương 1. Tìm hiểu máy tính... 5 1.1. Giới thiệu về máy tính... 5 1.1.1. Máy tính

Chi tiết hơn

Nội dung chương 3 IT1110 Tin học đại cương Phần I: Tin học căn bản Chương 3: Hệ thống máy tính 3.1. Giới thiệu 3.2. Chức năng và các thành phần của má

Nội dung chương 3 IT1110 Tin học đại cương Phần I: Tin học căn bản Chương 3: Hệ thống máy tính 3.1. Giới thiệu 3.2. Chức năng và các thành phần của má Nội dung chương 3 IT1110 Tin học đại cương Phần I: Tin học căn bản Chương 3: Hệ thống máy tính 3.1. Giới thiệu 3.2. Chức năng và các thành phần của máy tính 3.3. Liên kết hệ thống 3.4. Hoạt động của máy

Chi tiết hơn

(Tái bản lần thứ hai)

(Tái bản lần thứ hai) (Tái bản lần thứ hai) 2 MỤC LỤC PHẦN 1. LẬP TRÌNH 2D VỚI SCRATCH...7 LỜI NÓI ĐẦU...5 Mô đun 1. BẮT ĐẦU VỚI SCRATCH...9 1. Dự án...9 2. Giao diện...10 3. Lập trình...12 4. Khối lệnh (Block)...14 5. Biên

Chi tiết hơn

Một số thao tác trong windows XP Một số thao tác trong windows XP Bởi: Vien CNTT DHQG Hanoi MỘT SỐ THAO TÁC TRONG WINDOWS XP Tạo đĩa mềm khởi động DOS

Một số thao tác trong windows XP Một số thao tác trong windows XP Bởi: Vien CNTT DHQG Hanoi MỘT SỐ THAO TÁC TRONG WINDOWS XP Tạo đĩa mềm khởi động DOS Một số thao tác trong windows XP Bởi: Vien CNTT DHQG Hanoi MỘT SỐ THAO TÁC TRONG WINDOWS XP Tạo đĩa mềm khởi động DOS: Để tạo đĩa mềm khởi động Dos, bạn mở My Computer, bấm phím phải chuột vào biểu tượng

Chi tiết hơn

Hệ điều hành Bài tập tuần 6 1 Quản lý bộ nhớ Bài tập 1 : Xem thông tin bộ nhớ 1. Sử dụng top, ps đọc thông tin về kích thước vùng nhớ của 1 tiến trình

Hệ điều hành Bài tập tuần 6 1 Quản lý bộ nhớ Bài tập 1 : Xem thông tin bộ nhớ 1. Sử dụng top, ps đọc thông tin về kích thước vùng nhớ của 1 tiến trình Hệ điều hành Bài tập tuần 6 1 Quản lý bộ nhớ Bài tập 1 : Xem thông tin bộ nhớ 1. Sử dụng top, ps đọc thông tin về kích thước vùng nhớ của 1 tiến trình? 2. Tìm hiểu các thông tin hiển thị bởi các lệnh sau?

Chi tiết hơn

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

Chi tiết hơn

Máy tính cá nhân Máy tính cá nhân Bởi: Wiki Pedia Định nghĩa Máy tính cá nhân (tiếng Anh: personal computer, viết tắt PC) là một máy điện toán siêu nh

Máy tính cá nhân Máy tính cá nhân Bởi: Wiki Pedia Định nghĩa Máy tính cá nhân (tiếng Anh: personal computer, viết tắt PC) là một máy điện toán siêu nh Bởi: Wiki Pedia Định nghĩa (tiếng Anh: personal computer, viết tắt PC) là một máy điện toán siêu nhỏ với giá cả, kích thước và sự tương thích của nó khiến nó hữu dụng cho từng cá nhân. Khái niệm về máy

Chi tiết hơn

Microsoft Word - cau-truc-du-lieu-hang-doi.docx

Microsoft Word - cau-truc-du-lieu-hang-doi.docx Cấu trúc dữ liệu hàng đợi (Queue) Cấu trúc dữ liệu hàng đợi (Queue) là gì? Hàng đợi (Queue) là một cấu trúc dữ liệu trừu tượng, là một cái gì đó tương tự như hàng đợi trong đời sống hàng ngày (xếp hàng).

Chi tiết hơn

Kiến trúc tập lệnh1

Kiến trúc tập lệnh1 Kiến trúc tập lệnh1 Nội dung Xem lại cách thực thi một chương trình Phân loại lệnh trong MIPS Truy cập bộ nhớ trong MIPS Chi tiết về các toán tử Add, sub, etc. Chi tiết về các lệnh chuyển đổi dữ liệu Load,

Chi tiết hơn

ĐÁP ÁN 150 CÂU HỎI TIN HỌC KỲ THI NÂNG HẠNG GIÁO VIÊN TỈNH QUẢNG NAM 2018 Tác giả: Lê Quang Lưu HĐH là tập hợp các chương trình được tổ

ĐÁP ÁN 150 CÂU HỎI TIN HỌC KỲ THI NÂNG HẠNG GIÁO VIÊN TỈNH QUẢNG NAM 2018 Tác giả: Lê Quang Lưu HĐH là tập hợp các chương trình được tổ ĐÁP ÁN 150 CÂU HỎI TIN HỌC KỲ THI NÂNG HẠNG GIÁO VIÊN TỈNH QUẢNG NAM 2018 Tác giả: Lê Quang Lưu 0905914411 1. -HĐH là tập hợp các chương trình được tổ chức thành một hệ thống. -Là phần mềm cài đặt đầu

Chi tiết hơn

SM-G925F Sách hướng dẫn sử dụng Vietnamese. 04/2015. Rev.1.0

SM-G925F Sách hướng dẫn sử dụng Vietnamese. 04/2015. Rev.1.0 SM-G925F Sách hướng dẫn sử dụng Vietnamese. 04/2015. Rev.1.0 www.samsung.com Nội dung Thông tin cơ bản 4 Đọc đầu tiên 5 Phụ kiện trong hộp 6 Sơ đồ thiết bị 8 Thẻ SIM hoặc USIM 10 Pin 15 Bật và tắt thiết

Chi tiết hơn

Microsoft Word - danh-sach-lien-ket-doi-trong-c.docx

Microsoft Word - danh-sach-lien-ket-doi-trong-c.docx Danh sách liên kết đôi (Doubly Linked List) trong C Danh sách liên kết đôi (Doubly Linked List) là một biến thể của Danh sách liên kết (Linked List), trong đó hoạt động duyệt qua các nút có thể được thực

Chi tiết hơn

I. MSWLogo là gì. Giới thiệu. Là một ngôn ngữ lập trình được thiết kế và phát triển bởi Seymour Papert, Daniel Bobrow và Wallace Feurzeig. Trong chươn

I. MSWLogo là gì. Giới thiệu. Là một ngôn ngữ lập trình được thiết kế và phát triển bởi Seymour Papert, Daniel Bobrow và Wallace Feurzeig. Trong chươn I. MSWLogo là gì. Giới thiệu. Là một ngôn ngữ lập trình được thiết kế và phát triển bởi Seymour Papert, Daniel Bobrow và Wallace Feurzeig. Trong chương trình này bạn sẽ điều khiển 1 hoặc nhiều con rùa

Chi tiết hơn

Bài tập chương 1 ngôn ngữ lập trình visual basic Bài tập chương 1 ngôn ngữ lập trình visual basic Bởi: Khoa CNTT ĐHSP KT Hưng Yên MỤC TIÊU: SAU KHI HO

Bài tập chương 1 ngôn ngữ lập trình visual basic Bài tập chương 1 ngôn ngữ lập trình visual basic Bởi: Khoa CNTT ĐHSP KT Hưng Yên MỤC TIÊU: SAU KHI HO Bài tập chương 1 ngôn ngữ lập trình visual basic Bởi: Khoa CNTT ĐHSP KT Hưng Yên MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ Khai báo các biến thuộc các kiểu dữ liệu cơ bản (byte, integer,

Chi tiết hơn

PowerPoint Template

PowerPoint Template TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH KHOA CÔNG NGHỆ THÔNG TIN CÔNG NGHỆ PHẦN MỀM Chương 3: KHẢO SÁT VÀ PHÂN TÍCH YÊU CẦU Thời gian: 6 tiết Giảng viên: ThS. Dương Thành Phết Email: phetcm@gmail.com Website:

Chi tiết hơn

Trước khi sử dụng Hướng dẫn cơ bản Hướng dẫn chuyên sâu Thông tin cơ bản về máy ảnh Chế độ tự động / Chế độ bán tự động Hướng dẫn sử dụng máy ảnh Chế

Trước khi sử dụng Hướng dẫn cơ bản Hướng dẫn chuyên sâu Thông tin cơ bản về máy ảnh Chế độ tự động / Chế độ bán tự động Hướng dẫn sử dụng máy ảnh Chế Hướng dẫn sử dụng máy ảnh TIẾNG VIỆT máy ảnh, đảm bảo đọc kỹ hướng dẫn này, bao gồm cả phần Cảnh báo an toàn (= 4). Đọc hướng dẫn sẽ giúp bạn sử dụng máy ảnh đúng cách. Giữ hướng dẫn cẩn thận để có thể

Chi tiết hơn

Animation, Modules 6 - Hoạt hình, tách file

Animation, Modules 6 - Hoạt hình, tách file Animation, Modules 6 - Hoạt hình, tách file https://github.com/tqlong/advprogram Hoạt hình Các trò chơi trên máy tính thường không thể thiếu hoạt hình https://www.quora.com/why-is-animation-important Trực

Chi tiết hơn

Trước khi sử dụng Hướng dẫn cơ bản Hướng dẫn chuyên sâu Thông tin cơ bản về máy ảnh Chế độ tự động / Chế độ bán tự động Chế độ chụp khác Chế độ P Chế

Trước khi sử dụng Hướng dẫn cơ bản Hướng dẫn chuyên sâu Thông tin cơ bản về máy ảnh Chế độ tự động / Chế độ bán tự động Chế độ chụp khác Chế độ P Chế Hướng dẫn sử dụng máy ảnh máy ảnh, đảm bảo đọc kỹ hướng dẫn này, bao gồm cả phần Cảnh báo an toàn (= 4). Đọc hướng dẫn sẽ giúp bạn sử dụng máy ảnh đúng cách. Giữ kỹ hướng dẫn để có thể sử dụng sau này.

Chi tiết hơn

PNQW5655ZA-IIQG-MV72AVN.book

PNQW5655ZA-IIQG-MV72AVN.book Hướng dẫn sử dụng Điện thoại gọi cửa không dây Mã model VL-SWD501EX VL-SWD501UEX Thông tin quan trọng và Hướng dẫn sử dụng nhanh Tên model Điện thoại gọi cửa Điều khiển chính Mã model VL-SV71 VL-MV71 VL-MV72A

Chi tiết hơn

9-KiemThu

9-KiemThu Kiểm thử Nguyễn Thanh Bình Khoa Công nghệ Thông tin Trường ðại học Bách khoa ðại học ðà Nẵng Nội dung Giới thiệu về kiểm thử Kiểm thử trong tiến trình phát triển Kiểm thử hộp ñen Kiểm thử hộp trắng 2 1

Chi tiết hơn

Slide 1

Slide 1 Bài 6: Xuất nhập (input/output) 1 Khái niệm Người lập trình thường xuyên phải làm việc với một số thiết bị vào ra như màn hình, bàn phím, file, máy in, Với mỗi chương trình, có: Đầu ra chuẩn stdout: mặc

Chi tiết hơn

Microsoft Word - Con se lam duoc.doc

Microsoft Word - Con se lam duoc.doc Biên dịch: Như Quỳnh An Bình Ngọc Hân 1 Bìa 4 o Bạn có cho rằng điểm số và thành tích hiện tại của con bạn chưa thật sự phản ánh được thực lực của cháu? o Có phải con bạn luôn hết sức vất vả để cân bằng

Chi tiết hơn

Hướng dẫn bắt đầu sử dụng mozabook mozabook 2 Cài đặt, bắt đầu, Bản đồ màn hình Mở ấn phẩm, Nhập PDF và PPT Dẫn đường, Cập nhật ấn phẩm Ấn phẩm mới Nộ

Hướng dẫn bắt đầu sử dụng mozabook mozabook 2 Cài đặt, bắt đầu, Bản đồ màn hình Mở ấn phẩm, Nhập PDF và PPT Dẫn đường, Cập nhật ấn phẩm Ấn phẩm mới Nộ Hướng dẫn bắt đầu sử dụng mozabook mozabook Cài đặt, bắt đầu, Bản đồ màn hình Mở ấn phẩm, Nhập PDF và PPT Dẫn đường, Cập nhật ấn phẩm Ấn phẩm mới Nội dung thêm Bổ sung năng động Cảnh và video D, Lớp Công

Chi tiết hơn

Microsoft Word - Van pháp ti?ng Vi?t.doc

Microsoft Word - Van pháp ti?ng Vi?t.doc Văn Pháp Tiếng Việt Và Tiến Trình Viết Văn Khải Chính Phạm Kim Thư I. Dẫn Nhập 1. Văn Tự Của Người Việt Ở bất cứ nơi nào, hễ có con người là có tiếng nói riêng của giống người đó. Tiếng nói của người Việt

Chi tiết hơn

SM-G960F/DS SM-G965F/DS Sách hướng dẫn sử dụng Vietnamese. 03/2018. Rev.1.1

SM-G960F/DS SM-G965F/DS Sách hướng dẫn sử dụng Vietnamese. 03/2018. Rev.1.1 SM-G960F/DS SM-G965F/DS Sách hướng dẫn sử dụng Vietnamese. 03/2018. Rev.1.1 www.samsung.com Nội dung Thông tin cơ bản 4 Đọc đầu tiên 6 Tình huống và cách xử lý thiết bị nóng quá mức 10 Bố trí và các chức

Chi tiết hơn

Trường Đại học Dân lập Văn Lang - Nội san Khoa học & Đào tạo, số 5, 11/2005 NHÓM HỌC TẬP SÁNG TẠO THS. NGUYỄN HỮU TRÍ Trong bài viết này tôi muốn chia

Trường Đại học Dân lập Văn Lang - Nội san Khoa học & Đào tạo, số 5, 11/2005 NHÓM HỌC TẬP SÁNG TẠO THS. NGUYỄN HỮU TRÍ Trong bài viết này tôi muốn chia NHÓM HỌC TẬP SÁNG TẠO THS. NGUYỄN HỮU TRÍ Trong bài viết này tôi muốn chia sẻ cùng các thầy, cô giáo một số thông tin và những trải nghiệm của mình với học trò sau những tháng ngày miệt mài dạy và học

Chi tiết hơn

SM-G935F SM-G935FD Sách hướng dẫn sử dụng Vietnamese. 02/2016. Rev.1.0

SM-G935F SM-G935FD Sách hướng dẫn sử dụng Vietnamese. 02/2016. Rev.1.0 SM-G935F SM-G935FD Sách hướng dẫn sử dụng Vietnamese. 02/2016. Rev.1.0 www.samsung.com Nội dung Thông tin cơ bản 4 Đọc đầu tiên 6 Phụ kiện trong hộp 7 Sơ đồ thiết bị 9 Pin 15 Thẻ SIM hoặc USIM (thẻ nano

Chi tiết hơn

Các cấu trúc logic trong lập trình 1 Cấu trúc tuần tự (Sequence) 1.1 Những câu lệnh phải được sắp xếp theo thứ tự Một số hướng dẫn cho việc tổ chức câ

Các cấu trúc logic trong lập trình 1 Cấu trúc tuần tự (Sequence) 1.1 Những câu lệnh phải được sắp xếp theo thứ tự Một số hướng dẫn cho việc tổ chức câ Các cấu trúc logic trong lập trình 1 Cấu trúc tuần tự (Sequence) 1.1 Những câu lệnh phải được sắp xếp theo thứ tự Một số hướng dẫn cho việc tổ chức câu lệnh: 1-Sắp xếp câu lệnh sao cho sự phụ thuộc lẫn

Chi tiết hơn

Làm việc với các thư viện chung (common library) và các thư viện chia sẻ Làm việc với các thư viện chung (common library) và các thư viện chia sẻ Bởi:

Làm việc với các thư viện chung (common library) và các thư viện chia sẻ Làm việc với các thư viện chung (common library) và các thư viện chia sẻ Bởi: Làm việc với các thư viện chung (common library) và các thư viện chia sẻ Bởi: Phạm Quang Huy Làm việc với các thư viện chung (common library) Ngoài ra bạn cũng có thể tạo ra các thư viện tạm thời trong

Chi tiết hơn

Bài thực hành 6 trang 106 SGK Tin học 10

Bài thực hành 6 trang 106 SGK Tin học 10 Bài thực hành 6 trang 106 SGK Tin học 10 Đề bài: a) Khởi động Word và tìm hiểu các thành phần trên màn hình của Word b) Soạn một văn bản đơn giản c) Bài thực hành gõ tiếng Việt Lời giải: a) Khởi động Word

Chi tiết hơn

Microsoft Word - Luan an.doc

Microsoft Word - Luan an.doc i LỜI CAM ĐOAN Tôi xin cam đoan đây là công trình nghiên cứu của riêng tôi. Các số liệu, kết quả nêu trong luận án là trung thực, có nguồn gốc rõ ràng và chưa từng được ai công bố trong bất cứ một công

Chi tiết hơn

PGS - Tai lieu DHDCD v2

PGS - Tai lieu DHDCD v2 CÔNG TY CỔ PHẦN KINH DOANH KHÍ MIỀN NAM DỰ THẢO TÀI LIỆU PHIÊN HỌP ĐẠI HỘI ĐỒNG CỔ ĐÔNG THƯỜNG NIÊN NĂM 2019 TP. Hồ Chí Minh, tháng 04 năm 2019 CHƯƠNG TRÌNH ĐẠI HỘI ĐỒNG CỔ ĐÔNG THƯỜNG NIÊN NĂM 2019 1.

Chi tiết hơn

IPSec IPSec Bởi: Phạm Nguyễn Bảo Nguyên Chúng ta đã biết khi ta sao chép dữ liệu giữa 2 máy hoặc thông qua mạng VPN để nâng cao chế độ bảo mật người q

IPSec IPSec Bởi: Phạm Nguyễn Bảo Nguyên Chúng ta đã biết khi ta sao chép dữ liệu giữa 2 máy hoặc thông qua mạng VPN để nâng cao chế độ bảo mật người q Bởi: Phạm Nguyễn Bảo Nguyên Chúng ta đã biết khi ta sao chép dữ liệu giữa 2 máy hoặc thông qua mạng VPN để nâng cao chế độ bảo mật người quản trị mạng phải tạo các User Account để chỉ khi nào các User

Chi tiết hơn

Số: /2008/EIB/TB-TGĐ

Số: /2008/EIB/TB-TGĐ THỂ LỆ CHƯƠNG TRÌNH THANH TOÁN DỄ DÀNG, VI VU HÈ SANG. Tên chương trình: Thanh toán dễ dàng, Vi vu hè sang 2. Thời gian khuyến mại: từ 5/06/209 đến hết ngày 08/09/209. 3. Phạm vi khuyến mại: toàn quốc

Chi tiết hơn

SM-N9208 SM-N920C SM-N920CD SM-N920I Sách hướng dẫn sử dụng Vietnamese. 08/2015. Rev.1.0

SM-N9208 SM-N920C SM-N920CD SM-N920I Sách hướng dẫn sử dụng Vietnamese. 08/2015. Rev.1.0 SM-N9208 SM-N920C SM-N920CD SM-N920I Sách hướng dẫn sử dụng Vietnamese. 08/2015. Rev.1.0 www.samsung.com Nội dung Thông tin cơ bản 4 Đọc đầu tiên 5 Phụ kiện trong hộp 6 Sơ đồ thiết bị 12 Pin 18 Thẻ SIM

Chi tiết hơn

SoŸt x¾t l·n 1

SoŸt x¾t l·n 1 Phần 8D, Chương 1 II QUY ĐỊNH KỸ THUẬT Phần 8D TÀU CHỞ XÔ KHÍ HOÁ LỎNG CHƯƠNG 1 QUY ĐỊNH CHUNG 1.1 Quy định chung 1.1.1 Phạm vi áp dụng 1 Các yêu cầu trong Phần này áp dụng cho tàu chở xô khí hóa lỏng

Chi tiết hơn

Huong dan su dung phan mem Quan ly chat luong cong trinh GXD

Huong dan su dung phan mem Quan ly chat luong cong trinh GXD Tham gia khóa Thực hành phần mềm QLCL GXD lập hồ sơ chất lượng công trình xây dựng 0 LỜI MỞ ĐẦU... 4 SỬ DỤNG TÀI LIỆU... 5 CHƢƠNG 1. TỔNG QUAN VỀ QUẢN LÝ CHẤT LƢỢNG CÔNG TRÌNH XÂY DỰNG... 7 I. CƠ SỞ PHÁP

Chi tiết hơn

Microsoft Word - phuong-phap-thuyet-minh.docx

Microsoft Word - phuong-phap-thuyet-minh.docx Soạn bài: Phương pháp thuyết minh Composite Start Composite End Hướng dẫn soạn bài: Phương pháp thuyết minh I. Tầm quan trọng của phương pháp thuyết minh - Tầm quan trọng của phương pháp thuyết minh +

Chi tiết hơn

Moduel 7:Trinh chiếu bài thuyết trình 163 Moduel 7: rình chiếu bài thuyết trình 7.1. rình chiếu bài thuyết trình Thiết lập các tùy ch n cho chế độ Sli

Moduel 7:Trinh chiếu bài thuyết trình 163 Moduel 7: rình chiếu bài thuyết trình 7.1. rình chiếu bài thuyết trình Thiết lập các tùy ch n cho chế độ Sli 163 Moduel 7: rình chiếu bài thuyết trình 7.1. rình chiếu bài thuyết trình Thiết lập các tùy ch n cho chế độ Slide Show ác bước thực hành như sau: 1. Vào ngăn File, chọn Options, hộp thọai PowerPoint Options

Chi tiết hơn

Nokia 7 Plus Hướng dẫn sư dụng Bản phát hành vi-vn

Nokia 7 Plus Hướng dẫn sư dụng Bản phát hành vi-vn Nokia 7 Plus Hướng dẫn sư dụng Bản phát hành 2019-02-15 vi-vn Giới thiệu về hướng dẫn sử dụng này Quan trọng: Để biết thông tin quan trọng về cách sử dụng an toàn thiết bị và pin, hãy đọc thông tin An

Chi tiết hơn

Chöông 1 (tt.)

Chöông 1 (tt.) Cấu Trúc Hệ Điều Hành Các thành phần của hệ điều hành Các dịch vụ hệ điều hành cung cấp Giao tiếp giữa quá trình và hệ điều hành Các chương trình hệ thống (system program) Cấu trúc hệ điều hành Máy ảo

Chi tiết hơn

Lớp và đối tượng-các hàm và các lớp friend Lớp và đối tượng-các hàm và các lớp friend Bởi: Thanh Hiền Vũ CÁC HÀM VÀ CÁC LỚP friend Một hàm friend của

Lớp và đối tượng-các hàm và các lớp friend Lớp và đối tượng-các hàm và các lớp friend Bởi: Thanh Hiền Vũ CÁC HÀM VÀ CÁC LỚP friend Một hàm friend của Lớp và đối tượng-các hàm và các lớp friend Bởi: Thanh Hiền Vũ CÁC HÀM VÀ CÁC LỚP friend Một hàm friend của một lớp được định nghĩa bên ngoài phạm vi của lớp đó, lúc này có quyền truy cập đến các thành

Chi tiết hơn

Biến Cố : 40 Năm Nhìn Lại (Phần I) Bảo Vũ (ABC Radio) Hôm nay, cách đây đúng 40 năm, vào ngày mùng 2 tháng 11 năm 1963, cuộc đảo chính tại Sà

Biến Cố : 40 Năm Nhìn Lại (Phần I) Bảo Vũ (ABC Radio) Hôm nay, cách đây đúng 40 năm, vào ngày mùng 2 tháng 11 năm 1963, cuộc đảo chính tại Sà Biến Cố 1.11.1963: 40 Năm Nhìn Lại (Phần I) Bảo Vũ (ABC Radio) Hôm nay, cách đây đúng 40 năm, vào ngày mùng 2 tháng 11 năm 1963, cuộc đảo chính tại Sài Gòn, thủ đô Việt Nam Cộng Hòa đang bước vào những

Chi tiết hơn

Microsoft Word - Done_reformatted_4C Communication Guidelines_v2.2_VIE.docx

Microsoft Word - Done_reformatted_4C Communication Guidelines_v2.2_VIE.docx HƯỚNG DẪN TRUYỀN THÔNG Hướng dẫn Truyền thông 4C (Phiên bản 2.2) Lịch sử sửa đổi Phiên bản Ngày hiệu lực Chi tiết thay đổi 2.2 Tháng 11/2018 Không thay đổi nội dung so với phiên bản trước, chỉ thay đổi

Chi tiết hơn

ĐỀ CƯƠNG ÔN THI 1. Khái niệm về điều khiển Logic khả trình Có rất nhiều định nghĩa về bộ điều khiển Logic khả trình (Programmable logic controller viế

ĐỀ CƯƠNG ÔN THI 1. Khái niệm về điều khiển Logic khả trình Có rất nhiều định nghĩa về bộ điều khiển Logic khả trình (Programmable logic controller viế ĐỀ CƯƠNG ÔN THI 1. Khái niệm về điều khiển Logic khả trình Có rất nhiều định nghĩa về bộ điều khiển Logic khả trình (Programmable logic controller viết tắt là PLC). Đơn giản có thể xem PLC như là máy tính

Chi tiết hơn

HỘI THI TIN HỌC TRẺ TỈNH AN GIANG ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Khóa ngày: Thời gian : 20 phút (không kể thời gian

HỘI THI TIN HỌC TRẺ TỈNH AN GIANG ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Khóa ngày: Thời gian : 20 phút (không kể thời gian ĐỀ CHÍNH THỨC ĐỀ THI LÝ THUYẾT BẢNG A - KHỐI TIỂU HỌC Thời gian : 0 phút (không kể thời gian phát đề) SBD:...PHÒNG :... ĐỀ A Các câu hỏi dưới đây để trắc nghiệm kiến thức cơ bản về Tin học, về hệ điều

Chi tiết hơn

QUY TRÌNH KỸ THUẬT AN TOÀN KHOAN ĐCCT (Ban hành theo QĐ số 292 /QĐ-QLKT ngày 05 tháng 07 năm 2016 của Công ty Cổ phần Tư vấn thiết kế kiểm định và Địa

QUY TRÌNH KỸ THUẬT AN TOÀN KHOAN ĐCCT (Ban hành theo QĐ số 292 /QĐ-QLKT ngày 05 tháng 07 năm 2016 của Công ty Cổ phần Tư vấn thiết kế kiểm định và Địa QUY TRÌNH KỸ THUẬT AN TOÀN KHOAN ĐCCT (Ban hành theo QĐ số 292 /QĐ-QLKT ngày 05 tháng 07 năm 2016 của Công ty Cổ phần Tư vấn thiết kế kiểm định và Địa kỹ thuật) Phần I: Quy định chung CHƯƠNG I: NHỮNG QUY

Chi tiết hơn

11 tính năng hay trong Windows 10 mà Windows 8 không có Windows 10 là một sự cải tiến đáng kể so với Windows 8. Ngoài giao diện được làm mới, hầu hết

11 tính năng hay trong Windows 10 mà Windows 8 không có Windows 10 là một sự cải tiến đáng kể so với Windows 8. Ngoài giao diện được làm mới, hầu hết 11 tính năng hay trong Windows 10 mà Windows 8 không có Windows 10 là một sự cải tiến đáng kể so với Windows 8. Ngoài giao diện được làm mới, hầu hết những tính năng chủ chốt như màn hình Start, khả năng

Chi tiết hơn

Slide 1

Slide 1 TIN VĂN PHÒNG Chủ đề: Microsoft Office Nội dung Macro Một số kiến thức VBA cơ bản Kiểu dữ liệu Khai báo biến Lệnh vào/ra dữ liệu Viết thử một hàm với VBA 2 Macro 3 Macro Tính năng cao cấp, cho phép chúng

Chi tiết hơn

Microsoft Word - 10 quy tac then chot ve bao mat.doc

Microsoft Word - 10 quy tac then chot ve bao mat.doc Mười quy tắc then chốt về an toàn và bảo mật Tại trung tâm hỏi đáp về an toàn bảo mật thông tin của hãng Microsoft, hàng nghìn các bản báo cáo về an ninh hệ thống đã được nghiên cứu trong mỗi năm. Trong

Chi tiết hơn