Professional Documents
Culture Documents
Câu 1: (3đ)
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đ)
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
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
Int task1flag = 0;
u
cu
Int task2flag = 0;
int task3flag =0
void SystickISRHandler()
Systickcount ++;
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)
om
If(task2flag == 1) {task2(); task2flag = 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
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
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
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