Tải bản đầy đủ (.pdf) (34 trang)

Bài giảng Lập trình hệ thống nhúng - Bùi Quốc Bảo

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (201.89 KB, 34 trang )

LẬP TRÌNH HỆ THỐNG
NHÚNG

BÙI QUỐC BẢO

BỘ MƠN KỸ THUẬT ðIỆN TỬ-ðH BK TP.HCM

Mục tiêu mơn học
Tự mình thiết kế phần mềm cho một hệ thống
nhúng dùng 1 hay nhiều CPU dựa trên vi ñiều
khiển (8051, ARM) dựa trên một phần cứng có
sẵn.
Phần mềm được thiết kế có cấu trúc, dựa trên
ngôn ngữ cấp cao (C) hoặc sử dụng cả hợp
ngữ và C.
Nắm ñược lý thuyết cơ bản về hệ ñiều hành
nhúng; sử dụng ñược các hệ ñiều hành nhúng
cơ bản (FreeRTOS).

1


Tài liệu tham khảo
C and the 8051, 3rd Edition, Thomas
Schultz
Embedded C, Michael J Pont

ðánh giá kết quả
Giữa kỳ: 20%
Bài tập lớn: 30%
Cuối kỳ: 50%



2


Khái niệm về hệ thống nhúng
Hệ thống nhúng là sự kết hợp giữa phần
cứng máy tính và phần mềm, được thiết
kế ñể thực hiện một chức năng chuyên
biệt. Người sử dụng một hệ thống nhúng
không cần biết rằng hệ thống có một
máy tính bên trong
VD: remote TV, lị vi sóng,…

Vi xử lý trong hệ thống nhúng
Họ 8086
PowerPC
MIPS
Họ 8051
PIC

Tùy thuộc vào ứng dụng và giá thành, người
thiết kế quyết ñịnh loại vi xử lý dùng trong hệ
thống nhúng.

3


Vi xử lý dùng trong môn học này
8051
ARM


Ngôn ngữ lập trình
Assembler
C

4


Lý do sử dụng ngôn ngữ C
C cho phép lập trình có cấu trúc.
Ngơn ngữ C cho phép dễ dàng truy cập đến
cấu trúc phần cứng (ví dụ thơng qua con trỏ)
C ñược dùng rất phổ biến.
Hầu hết các họ vi xử lý đều được hỗ trợ trình
biên dịch C.
Rất nhiều t ngun tham khảo (sách, ví dụ,
website …) về lập trình C.

Lý do dùng hợp ngữ (Assembler)
Cho phép viết những chương trình có
kích thước nhỏ nhất và chạy với tốc độ
nhanh nhất.
Thích hợp cho những ứng dụng có u
cầu nghiêm ngặt về thời gian.

5


C operator
=

@
?
<
>
!
~
+
*
/
%
|
&
^
.

assignment statement
address of
selection
less than
greater than
logical not (true to false, false to true)
1's complement
addition
subtraction
multiply or pointer reference
divide
modulo, division remainder
logical or
logical and, or address of
logical exclusive or

used to access parts of a structure

C operator
==
<=
>=
!=
<<
>>
++
-&&
||

equal to comparison
less than or equal to
greater than or equal to
not equal to
shift left
shift right
increment
decrement
boolean and
boolean or

6


+=
-=
*=

/=
|=
&=
^=
<<=
>>=
%=
->

add value to
subtract value to
multiply value to
divide value to
or value to
and value to
exclusive or value to
shift value left
shift value right
modulo divide value to
pointer to a structure

Comments (chú thích)
// This is a comment line
/*
This is a comment block
*/

7



Preprocessor Directives (chỉ dẫn
tiền xử lý)
ðược xử lý ñầu tiên trong q trình biên
dịch
Bắt đầu bằng từ khóa #
VD:
#include “LCD.h"
#define LCD *(unsigned char volatile *)(0x1003)

Key word (Từ khóa)
asm
auto
break
case
char
const
continue
default
do
double
else
extern
float

Insert assembly code
Specifies a variable as automatic (created
on the stack)
Causes the program control structure to finish
One possibility within a switch statement
8 bit integer

Defines parameter as constant in ROM
Causes the program to go to beginning of loop
Used in switch statement for all other cases
Used for creating program loops
Specifies variable as double precision floating point
Alternative part of a conditional
Defined in another module
Specifies variable as single precision floating point

8


Key word (Từ khóa)
for
goto
if
int
long
register
return
short

Used for creating program loops
Causes program to jump to specified
location
Conditional control structure
16 bit integer
32 bit integer
store the variable onto the CPU register if
space on the register is available

Leave function
16 bit integer

Key word (Từ khóa)
signed
sizeof
static
struct
switch
typedef
unsigned
void
volatile
while

Specifies variable as signed (default)
Built-in function returns the size of an
object
Stored permanently in memory, accessed
locally
Used for creating data structures
Complex conditional control structure
Used to create new data types
Always greater than or equal to zero
Used in parameter list to mean no parameter
Can change implicitly
Used for creating program loops

9



Dấu chấm phẩy (semicolons)
Chấm dứt câu lệnh
VD:
For (i=0;i<1000;i++);

Dấu hai chấm (colons)
Dùng ñể ñịnh nghĩa 1 nhãn (label)
VD:
char Debounce(void)
{
short Cnt;
unsigned char LastData;
Start:

Cnt=0;
/* number of times Port C is the same */
LastData=PORTC;
Loop: if(++Cnt==100) goto Done;
/* same thing 100 times */
if(LastData!=PORTC) goto Start;/* changed */
goto Loop;
Done: return(LastData);
}

10


Dấu phẩy (Commas)
Dùng ñể ngăn cách các phần tử.

VD:
unsigned short beginTime, endTime, elapsedTime;
short add(short x, short y)

;

Dấu nháy (Apostrophes)
Dùng ñể xác ñịnh ký tự
VD:
mych='a' ;

11


Dấu nháy kép (Quotation marks )
Dùng ñể xác ñịnh chuỗi (string)
VD:
unsigned char Name[] = “embedded";

Dấu ngoặc nhọn (braces)
Dùng ñể bắt ñầu và kết thúc một khối câu lệnh
VD:
For (i=0;i<100;i++)
{
delay(100);
PORTB = 0xff;
delay(100);
PORTB = 0x00;

}


12


Dấu ngoặc vng (Brackets )
Dùng để chỉ kích thước của mảng
(array) và chỉ số
VD:
short fifo[100];
I = fifo[0];

Dấu ngoặc tròn (Parentheses )
Bao quanh danh sách tham số
VD:
add(x,y);

Xác ñịnh mức ñộ ưu tiên thực thi của
các biểu thức
VD:
X = (17+3)/2 ;

13


Biến tĩnh (Static)
Biến tĩnh là biến mà giá trị của nó được
giữ trong suốt q trình chương trình
chạy, nhưng chỉ truy cập được bên trong
chương trình mà nó được định nghĩa


Biến tĩnh
char sumIt(void)
{
static char sum = 0;
sum = sum + 1;
return sum;
}
void main(void)
{
char i;
char result;
for(i=0;i<10;i++) result = sumIt();
}

14


Từ khóa volatile
Từ khóa volatile mơ tả 1 biến mà giá trị
có thể thay đổi khơng đốn trước được.
Biến volatile ñược dùng ñể mô tả:
Các ngoại vi ñược thiết kế theo kiểu
memory-mapped
Biến tồn cục mà bị thay đổi giá trị trong
trình phục vụ ngắt
Biến tồn cục được truy cập bởi nhiều tác
vụ trong các ứng dụng đa tác vụ

Từ khóa volatile
void main(void)

{
unsigned char xdata *p = (char xdata *) 0x8000;
while (*p == 0);
}

void main(void)
{
volatile unsigned char xdata *p = (char xdata *) 0x8000;
while (*p == 0);
}

15


Từ khóa extern
Dùng để chỉ biến được định nghĩa trong
1 module khác.
VD:
Trong module LCD.h, khai báo biến
char LCD_value;

Trong module main.h
extern char LCD_value;

Biến ñược khởi tạo trước
short Temperature = -55;
const unsigned short Steps[4] = {10, 9,
6, 5};
char Name[4] = "Jon";
char Name[6] = "Jon";

char Name[] = "Jon";
char *NamePt = "Jon";

16


Con trỏ (pointer)
Con trỏ là 1 biến chứa một ñịa chỉ
Giá trị của con trỏ có thể thay đổi được
Question:
Khai báo biến a: int a;
ðịa chỉ của biến a: &a có phải là con trỏ hay
khơng?

Con trỏ
int *p;
p = 0x8000;
int *p = (int *)0x8000;
int k;
p = &k;
#define SW

*(unsigned char volatile *)(0x2000)

17


Phép tốn với con trỏ
Phép cộng:
Con trỏ ln chỉ vào ñịa chỉ ñầu của một ñối

tượng (object). Cộng 1 vào con trỏ làm nó
chỉ đến đối tượng tiếp theo.

Phép so sánh:
Khi so sánh 2 con trỏ, giá trị chúng ñang
mang ñược coi như số không dấu

int

p

*p;

int

*k;

p = 0x2000;

k

0x01

0x2000

0x00

0x2001

0x02


0x2002

0x00

0x2003

*p = 1;
k = p+1;
*k = *p+1;

18


Mảng và chuỗi (array and string)
Mảng là tập hợp các biến giống nhau có cùng
tên gọi.
Các phần tử của mảng ñược xác ñịnh bằng
chỉ số (bắt ñầu từ 0).
Kích thước của mảng là cố ñịnh.
VD:
int a[4] = {1,2,3,4};
int b = a[0];

Mảng và chuỗi (array and string)
Chuỗi tương tự mảng, ngoại trừ:
Chuỗi có thể có số lượng phần tử thay
đơỉ.
Các phần tử của chuỗi là ký tự ASCII kết
thúc bằng giá trị 0.

Chuỗi ñược khai báo như 1 con trỏ kiểu
char
char * mystring = “embedded”;

19


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

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

20



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

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

21


Truy cập phần tử con của struct
PortC.mode=0;

PortC.addr=(unsigned char volatile *)(0x1003);
PortC.ddr=(unsigned char volatile *)(0x1007);
(*PortC.ddr)=0;
(*PortB.addr)=(*PortC.addr);

Truy cập struct thông qua pointer
port PORTA;
port *p;
p = &PORTA;
p->mode=0; (dùng dấu -> ñể truy cập phần
tử con của 1 con trỏ kiểu struct)

22


Khởi tạo struct
port
PortE={1,
(unsigned char volatile *)(0x100A),
(unsigned char volatile *)(0)};

Struct and union
typedef struct {
union {
__IO uint32_t u32ISPCON;
struct
{
__IO uint32_t ISPEN:1;
__IO uint32_t BS:1;
__I uint32_t RESERVE0:2;

__IO uint32_t CFGUEN:1;
__IO uint32_t LDUEN:1;
__IO uint32_t ISPFF:1;
__IO uint32_t SWRST:1;
__IO uint32_t PT:3;
__I uint32_t RESERVE1:1;
__IO uint32_t ET:3;
__I uint32_t RESERVE2:17;
} ISPCON;
};
union
{ __IO uint32_t u32ISPADR;
__IO uint32_t ISPADR;
} }FMC_T;

#define AHB_BASE (( uint32_t)0x50000000)
#define FMC_BASE
#define FMC

(AHB_BASE +0x0C000)

((FMC_T *)FMC_BASE)

FMC->ISPCON.ISPEN = 1
FMC->ISPADR = 0x20000000;

23


Function (Hàm, chương trình con)

Một chương trình lớn thường được chia
thành nhiều khối (module)
Module là 1 tác vụ nhận dữ liệu vào
(input), xử lý và xuất ra kết quả (output).
Các module ñược tạo ra như là các hàm
(function).

Function

Một module (Nguồn: EmbeddedProg/Developing Embedded Software in C)
int FtoC(int TempF){
int TempC;
TempC=(5*(TempF-32))/9; // conversion
return TempC;}
Note:
Hạn chế truy cập đến biến tồn cục và I/O trong 1 function

24


Mô tả hàm (function declaration)
Mô tả hàm cho ta biết tên hàm, kiểu của các
tham số và kiểu kết quả trả về.
// declaration
input
output
void Ritual(void);
char InChar(void);
void OutChar(char letter);
short InSDec(void);

void OutSDec(short i);
char Max(char in1,char in2);
int EMax(int in1,int in2);
void OutString(char* mystring);
char *alloc(int size);
int

// none
none
// none
8-bit
// 8-bit
none
// none
16-bit
// 16-bit
none
// two 8-bit
8-bit
// two 16-bit
16-bit
// pointer to 8-bit none
// 16-bit
pointer to
8-bit
Exec(void(*fnctPt)(void)); // function pointer 16-bit

ðịnh nghĩa hàm (function definition)
Một ñịnh nghĩa của hàm là cách mà hàm
đó thực thi.

type Name(parameter list){
CompoundStatement
};
int FtoC(int TempF)
{
int TempC;
TempC=(5*(TempF-32))/9; // conversion
return TempC;
}

25


×