ĐỀ THI HỌC KỲ 1
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 laptop, máy vi tính)
Câu 1: (4đ)
Một hệ thống điều khiển nhiệt độ hoạt động như sau:
• Bật lò đốt khi nhiệt độ đo được nhỏ hơn 100. Thời gian giữa 2 lần đọc là 100 ms.
• Trong khi bật lò, chớp nháy một LED với chu kỳ 1s để báo cho người dùng biết là
lò đang bật. Khi tắt lò thì LED thôi không chớp nháy.
Các hàm cho sẵn như sau:
• int readTemp(void) : trả về giá trị nhiệt độ
• void turnHeaterOn(void) : bật lò
• void turnHeaterOff(void) : tắt lò
• void setLed() : bật LED
• void clearLed() : tắt LED
• void initSysTick(unsigned int number_ms) : khởi động ngắt
systemTick với chu kỳ number_ms milisecond
• void Systick_ISR(void) : chương trình phục vụ ngắt systemTick. Sinh viên sẽ
tự thực hiện hàm này ở câu c.
a) Thiết kế máy trạng thái cho hệ thống trên (1.5đ)
Hướng dẫn:
Chia làm 2 máy trạng thái đồng bộ dùng biến chung (shared variable)
b) Time interval của hệ thống là bao nhiêu? (0.5đ)
c) Viết chương trình thực thi hệ thống trên theo máy trạng thái đã thiết kế. (2đ)
Câu 2: (2đ)
Cho chương trình assembly sau cho ARM Cortex M3:
sub_func
MOV R3, R0
PUSH {R4,LR}
MOVS R0, #0
MOV R2, R0
B loc_448
loc_440
LSLS R4, R2, #2
LDR R4, [R3,R4]
ADDS R0, R4, R0
ADDS R2, R2, #1
loc_448
CMP R2, R1
BLT loc_440
LDR R1, =0x55555555
EORS R0, R1
POP {R4,PC}
a) Đoạn chương trình con trên làm công việc gì? Giải thích. (1đ)
b) Viết chương trình con tương ứng dùng ngôn ngữ C. (1đ)
Câu 3: (4đ)
Cho đoạn chương trình dùng FreeRTOS như sau, trong đó hàm vPrintString xuất 1
chuỗi ra serial port 0. Thời gian hàm này thực thi là 20 ms
.
Hàm toggleLED() dùng để đảo trạng thái 1 LED. Hàm này thực thi trong thời gian rất
ngắn.
void vTask1( void *pvParameters );
void vTask2( void *pvParameters );
void vTask3( void *pvParameters );
int main( void )
{
xTaskCreate( vTask1, "Task 1", 200,NULL, 1,NULL );
xTaskCreate( vTask2, "Task 2", 200, NULL, 2, NULL );
xTaskCreate( vTask3, "Task 3", 200, NULL, 3, NULL );
vTaskStartScheduler();
for( ;; );
}
void vTask1( void *pvParameters )
{
const char *pcTaskName = "Task 1 is running\n";
for( ;; )
{
vPrintString( pcTaskName );
vTaskDelay( 10 / portTICK_RATE_MS );
}
}
void vTask2( void *pvParameters )
{
const char *pcTaskName = "Task 2 is running\n";
for( ;; )
{
vPrintString( pcTaskName );
vTaskDelay( 10 / portTICK_RATE_MS );
}
}
void vTask3( void *pvParameters )
{
for( ;; )
{
toggleLED();
vTaskDelay( 250 / portTICK_RATE_MS );
}
}
a) Hãy vẽ giản đồ thực thi 3 tác vụ theo thời gian và giải thích. (1đ) (Thang thời
gian không cần theo tỉ lệ chính xác, chỉ cần chú thích rõ thời gian).
b) Hiện tượng lỗi xung đột nào sẽ xảy ra? Giải thích (1đ)
c) Hãy sửa lại chương trình dùng semaphore để khắc phục lỗi này (2đ)
BM Điện Tử Cán bộ ra đề
Bùi Quốc Bảo