LẬP TRÌNH HỆ THỐNG
NHÚNG
BÙI QUỐC BẢO
Delay sử dụng vòng lặp lệnh
For(i=1000;i>0;i--);
ðơn giản
Không ñòi hỏi timer
Không biết chính xác ñược khoảng delay là bao nhiêu
ðược sử dụng khi cần tạo ra các thời gian delay
không ñòi hỏi sự chính xác lớn.
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
2
1
Cấu trúc Timeout
N
Key pressed?
Nếu phím bị hỏng hay tiếp xúc không
tốt, chương trình sẽ bị treo trong quá
trình chạy (run-time)
Y
Process
3
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
Cấu trúc Timeout
ellapseTime = initValue
N
N
Key pressed?
ellapseTime--
ellapseTime=0?
Y
Process
sbit
Key = P1^0;
ellapseTime = 1000;
While (Key != 0) && (--ellapseTime != 0);
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
4
2
8051 Timer
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
5
8051 Timer
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
6
3
Delay using timer
void delay50ms(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
ET = 0;
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
While (!TF0);
TR0 = 0;
TF0 = 0;
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
7
Delay.h
#ifndef _DELAY_H
#define …………….
#define
#define
#define
#define
OSC_FREQ
OSC_PER_INST
TIME_1ms
PRELOAD_1ms
12
12
1000
65536 – (TIME_1ms)/(OSC_FREQ/OSC_PER_INST)
#define PRELOAD_1ms_H
#define PRELOAD_1ms_L
(PRELOAD_1ms / 256)
(PRELOAD_1ms % 256)
#define TIME_50ms
…………………………………………………………
#define PRELOAD_50ms …………………………………………………….
void
delay1ms(void);
void
delay50ms(void);
void
delayMs(unsigned int n);
#endif
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
8
4
delay.c
#include <reg51.h>
#include “delay.h”
void
{
}
void
{
}
void
{
}
delay1ms(void)
delay50ms(void)
delayMs(unsigned int n)
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
9
Access lowbyte and highbyte
#define LOWBYTE(v)
#define HIGHBYTE(v)
((unsigned char) (v))
((unsigned char) (((unsigned int) (v)) >> 8))
#define BYTELOW(v)
#define BYTEHIGH(v)
(*(((unsigned char *) (&v) + 1)))
(*((unsigned char *) (&v)))
Void main(void) {
volatile unsigned char i;
i = LOWBYTE(0x1234);
i = BYTEHIGH(0x1234);
Sai chỗ nào
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
10
5
Multi tasking
Cấu trúc superloop:
int main(void)
{
while (1) {
Task_1();
Task_2();
}
}
Nhược ñiểm:
Không dùng cho những ứng
dụng ñòi hỏi chính xác về mặt
timing.
Không có khả năng dừng 1 task
ñang thực thi ñể thực hiện task
còn lại
(pre-emption)
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
11
Cấu trúc superloop với delay
30s
5s
35s
void Delay(uint32_t seconds)
{
// Setup a hardware timer for the given time
// Loop until the delay has been reached.
}
int main(void)
{
while (1) {
Set_Green();
Delay(30);
Set_Yellow();
Delay(5);
Set_Red();
Delay(35);
}
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
12
6
Cấu trúc superloop với delay
Expected timing
void Delay(uint32_t milliseconds)
{
// Setup a hardware timer for
// the given time
// Loop until the delay has
//been reached.
}
int main(void)
{
while (1) {
Task_1();
Delay(5);
Task_2();
Delay(5);
Real timing
}
}
Nhược ñiểm:
Cấu trúc này chỉ chạy ñúng trong trường hợp các task rất ngắn
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
13
Sandwich delay
int main(void)
{
while (1) {
Start_Timer(5);
Task_1();
Wait_For_Timer();
Nhược ñiểm:
Không cung cấp ñược mức ñộ ưu
tiên cho các tác vụ
Start_Timer(5);
Task_2();
Wait_For_Timer();
}
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
14
7
Foreground/Background scheduling
// Run by hardware
//every millisecond
BackGround Level
void Timer_ISR(void)
{
updateData();
}
updateDisplay();
void main(void)
{
Init_ISR();
updateDisplay();
ForeGround Level
updateData();
processInput();
while (1) {
updateDisplay();
processInput(); }
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
15
Round-Robin scheduler: Poll and
serve
Nhược ñiểm:
I/O 1 need service
cycle time
Y
Nếu 1 thiết bị cần thời
gian ñáp ứng nhanh hơn
I/O service #1 1 “cycle time”, hệ thống
có thể chạy sai.
Y
Nếu có 1 trình phục vụ
I/O chạy trong thời gian
dài, ñáp ứng của hệ
I/O service #2 thống sẽ bị chậm.
N
I/O 2 need service
N
ðộ ổn ñịnh của hệ thống
phụ thuộc nhiều yếu tố.
Khó sửa ñổi chương
trình
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
16
8
Round-Robin scheduler with
interrupt
Interrupt Level
Task level
I/O 1 Flag?
Y
Clear Flag 1
I/O service #1
ISR1
Set Flag 1
ISR2
Set Flag 2
N
Y
I/O 2 Flag?
Clear Flag 2
I/O service #2
N
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
17
Nhược ñiểm:
Tất cả các tác vụ có cùng mức ưu tiên
Solution:
ðưa các code có ñộ ưu tiên cao vào ISR
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
18
9
8051 interrupt vector table
Ban ñầu, họ 8051 chỉ có 5 nguồn ngắt
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
19
Interrupt function
Các nhà sản xuất sau này thêm vào nhiều ngắt cho 8051. Keil C hỗ trợ 32
vector ngắt.
ðịnh nghĩa ngắt:
void ISR_name(void) interrupt interrupt_number using bank_number
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
20
10
Case study
30s
5s
35s
Viết chương trình ñiều khiển ñèn giao thông:
a) Dùng phương pháp sandwich delay
b) Dùng ngắt
Các ñèn xanh-vàng-ñỏ ñược ñiều khiển bởi
P1.0, P1.1, P1.2. ðưa chân port lên 1 làm ñèn
sáng.
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
21
11