ĐỀ THI HC K 1
MÔN: LP TRÌNH NHÚNG
Thi gian: 90 phút
(SV được s dng tài liu, không s dng laptop, máy vi tính)
Câu 1: (4đ)
Mt h thng điều khin nhiệt độ hoạt động như sau:
Bt lò đốt khi nhiệt độ đo đưc nh hơn 100. Thi gian gia 2 lần đọc là 100 ms.
Trong khi bt lò, chp nháy mt LED vi chu k 1s để báo cho người dùng biết là
đang bật. Khi tt 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) : bt lò
void turnHeaterOff(void) : tt lò
void setLed() : bt LED
void clearLed() : tt LED
void initSysTick(unsigned int number_ms) : khởi động ngt
systemTick với chu k number_ms milisecond
void Systick_ISR(void) : chương trình phc v ngắt systemTick. Sinh viên s
t thc hin hàm này câu c.
a) Thiết kế y trng thái cho h thng trên (1.5đ)
Hướng dn:
Chia làm 2 máy trạng thái đồng b dùng biến chung (shared variable)
b) Time interval ca h thng là bao nhiêu? (0.5đ)
c) Viết chương trình thc thi h thng 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 vic gì? Gii 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. Thi gian hàm này thc thi là 20 ms.
m toggleLED() dùng để đảo trạng thái 1 LED. Hàm này thc thi trong thi gian rt
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) y v giản đồ thc thi 3 tác vụ theo thi gian và giải thích. (1đ) (Thang thi
gian không cn theo t l chính xác, ch cn chú thích rõ thi gian).
b) Hiện tượng lỗi xung đột nào sẽ xảy ra? Giải thích (1đ)
c) y sa lại chương trình dùng semaphore đ khc phc li này (2đ)
BM Điện T Cán b ra đề
Bùi Quc Bo