Đề thi lập trình nhúng có đáp án
ĐỀ 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 . 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. 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. ĐỀ 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