You are on page 1of 5

Khoa Điện-Điện Tử ĐỀ THI HỌC KỲ 2 – 2017/2018

Bộ Môn Điện Tử MÔN: LẬP TRÌNH NHÚNG


Thời gian: 90 phút
SV được sử dụng tài liệu, không sử dụng máy vi tính
(Điểm số tổng cộng tối đa là 11đ)

Câu 1: (3đ)

a) (1đ) Giải thích sự khác nhau giữa 3 khai báo:


int (* funcPtr) (int );con trỏ hàm có đối số kiểu int và giá trị trả về kiểu int
(int *) funcPtr (int ); hàm có đối số kiểu int và gia trị trả về là con trỏ
kiểu int
(int *) (* funcPtr) (int );con trỏ hàm có đối số kiểu int giá trị trả về là con

om
trỏ kiểu int
b) (0.5đ) Giải thích sự khác nhau giữa kiểu signed char và unsigned char.

.c
Biến signed char là biến có dấu :[-126:127];
Biến usigned char là biến k dấu: [0:255];

ng
c) (0.5đ) Biến count được khai báo như sau: unsigned short count = 65535;
Sau lệnh count+=16; giá trị count là bao nhiêu?
co
Unsigned short : 2bytes : [0:65535]; khi tràn giá trị sẽ quay về giá trị 0; count =
15
an

d) (1đ) Viết hàm int countSpace(char *str) đếm số khoảng trắng trong một chuỗi. (Mã
ASCII của khoảng trắng là 32).
th
o ng
du
u
cu

Câu 2: (3đ)

Ba tác vụ có tính chất như sau:

void T1(void): chạy sau mỗi 1000 ms, thời gian chạytrong khoảng từ 5ms đến 100ms.

CuuDuongThanCong.com https://fb.com/tailieudientucntt
void T2(void): chạy sau mỗi 400ms, thời gian chạy trong khoảngtừ 1 đến 10ms.

void T3(void): chạy sau mỗi 200ms, thời gian chạy trong khoảngtừ 1 đến 10ms.

a) (1đ) Hãy vẽ sơ đồ sắp lịch cho 3 tác vụ (schedule) để đảm bảo cả ba chạy đúng
timing. Mỗi Systick cách nhau 1 ms.Giải thích.(Hình sau là ví dụ minh họa của 1 sơ
đồ sắp lịch chưa phù hợp, S100 nghĩa là system tick thứ 100).

T1 T T2
3

S1 S5 S100 S110 S150 S500

om
Task1: 1 -1001 – 2001 – 3001
Task 2: 102 – 502 – 902 – 1302 – 1702 – 2102 – 2502 – 2902 – 3302 – 3702
Task3 : 113 – 313 – 513 – 713 – 913 – 1113 - 1313

.c
b) (0.5đ) Viết hàm void initSystick(void) khởi động Systick Timer với chu kỳ 1 ms, cho
phép ngắt.

ng
Void initSystick(void) co
{
SysTickPeriodSet(SysCtlClockGet()/1000);
an

IntMasterEnable();
SysTickIntEnable();
th

SysTickEnable();
}
ng

c) (1.5đ)Viết chương trình thực hiện 3 tác vụ trên với sơ đồ sắp lịch và SystickTimer
của câu a và b. (Chỉ viết chương trình phục vụ ngắt Systick và vòng lặp chính, đồng
o

thời khai báo các biến toàn cục cần thiết)


du

Int task1flag = 0;
u
cu

Int task2flag = 0;

int task3flag =0

void SystickISRHandler()

{ static int systickcount = 0

Systickcount ++;

If(systickcount == 1 || 1001){task1flag = 1;}

If(systickcount == 102 || 502||902 || 1302 || 1702) { task2flag = 1;}

If(systickcount == 113||313||513||713||913||1113||1313||1513||1713||1913) {
task3flag = 1;}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
If(systickcount == 2000) {systickcount = 0);}

int main(void)

......

while(1)

If(task1flag == 1) {task1(); task1flag = 0;}

om
If(task2flag == 1) {task2(); task2flag = 0;}

If(task3flag == 1) {task3(); task3flag = 0;}

.c
}

ng
Câu 4:(2đ) co
a) (0.5đ) Giải thích sự khác nhau cơ bản giữa hệ điều hành co-operative (non-preemptive)
và pre-emptive. Hệ điều hành non preemtive là hệ điều hành có các task thực thi cho đến
an

khi hoàn thành, không nhường cpu cho các task khác trong quá trình thực thi. Hệ điều
hành preemtive là hệ điều hành có task đang thực thi sẽ dừng lại nhường cpu cho task
th

khác nếu đang cần cpu.


ng

b) (0.5đ) Viết lệnh khởi tạo 1 queue tên là myQueue, gồm 100 phần tử kiểu float.
xQueueHandle myQueue;
o

myQueue = xqueueCreate(100, sizeof(float));


du

c) (0.5đ) Sau khi thực hiện lệnh xQueueSendFromISR( xRxQueue, &cIn,


&xHigherPriorityTaskWoken );biếnxHigherPriorityTaskWokensẽ có
u

giá trị như thế nào? Giải thích các trường hợp có thể xảy ra. (0.25đ)
cu

Sau khi thực hiện lệnh này thì nếu có task nào đang chờ queue mà có mức ưu tiên
cao hơn task đang thực hiện trước ngắt thì biến này sẽ set lên 1,và macro
portEND_SWITCH_TASK sẽ thực hiện chuyển tác vụ tiếp theo đc thực hiện là tác vụ
đang chờ queue
d) (0.5đ) Để sử dụng được lệnh xQueueSendFromISR, mức ưu tiên của ISR mà lệnh
này được gọi phải như thế nào? Đế sử dụng các API của hệ thống thì mức ưu tiên của
task này phải nhỏ hơn hoặc bằng mức giá trị đc định nghĩa bởi #define
configMAX_SYSCALL_INTERUPT_PRIORITY

Câu 5:(3đ)
Hãy viết chương trình dùng FreeRTOS thực hiện công việc sau:
Ban đầu tắt tất cả các LED, sau đó làm song song hai tác vụ sau:
*) Chớp Led đỏ với thời gian sáng/tắt là 1s
*) Nếu SW1 nhấn/nhả 3 lần liên tục, đảo Led xanh dương.

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Cho trước các hàm:
void InitHardware(); hàm này khởi động các input/output cần thiết.
void setLed(int Led); hàm này bật Led, tham số Led=0 là Led đỏ, Led=1 là Led xanh dương
void clearLed(int Led); hàm này tắt Led, tham số Led=0 là Led đỏ, Led=1 là Led xanh dương
int readSW1(void); hàm này đọc SW1, bằng 0 nghĩa là SW nhấn, 1 nghĩa là SW nhả.

SW1

LED

om
void toggleLedGreen(void){

.c
static int state = 0;

state = !state;

ng
if (state == 0){clearLed(1);// ledControl(LEDGREEN, OFF)}
co
else {setLed(1); //ledControl(LEDGREEN, ON)}
an

}
th

static void ToggleLedGreen(void *pvParameters){


ng

int count = 0;
o

while(1)
du

{
u

if (readSW1()){
cu

while(readSW1()){}

count++;

if (count == 3){

count = 0;

toggleLedGreen(); }

CuuDuongThanCong.com https://fb.com/tailieudientucntt
static void BlynkLedRed(void *pvParameters)

while(1)

ledControl(LEDRED,ON);

vTaskDelay(1000/portTICK_RATE_MS);

ledControl(LEDRED,OFF);

vTaskDelay(1000/ portTICK_RATE_MS);

om
}

}s

.c
ng
co
an
th
o ng
du
u
cu

CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like