wayground logo

Free Printable Worksheets

Font size

S
M
L
XL
Worksheets

Bài tập FreeRTOS và cấp phát bộ nhớ (Worksheet)

Total questions: 29

Worksheet time: 15mins

Name
Class
Date
1.

Các biến cục bộ bên trong một hàm được cấp phát như thế nào?

a)

Được cấp phát ngay khi khởi tạo chương trình trong không gian cố định

b)

Được cấp phát động trong vùng bất kỳ của RAM

c)

Được cấp phát như các biến toàn cục

d)

Thường được cấp phát động trong vùng heap khi hàm được gọi

2.

Đâu là mô tả đúng về một hàm được khai báo static?

a)

Vùng mà dành cho hàm sẽ được cấp phát ngay khi hàm được gọi

b)

Hàm này không được chứa các biến cục bộ

c)

Vùng mà dành cho hàm sẽ được cấp phát ngay khi thực thi chương trình chính

d)

Vùng mà dành cho hàm luôn nhỏ hơn 1KB

3.

Bên trong một hàm (không phải hàm main()), biến nào sẽ được cấp phát ngay khi khởi tạo chương trình?

a)

Biến được khai báo kiểu int

b)

Biến được khai báo bởi từ khóa static

c)

Biến được khai báo kiểu char

d)

Biến được khai báo bởi từ khóa volatile

4.

Khi vi điều khiển đang chạy hệ điều hành FreeRTOS với 3 Task đang chạy song song, nếu có ngắt xảy ra thì mô tả nào sau đây là đúng?

a)

Task có độ ưu tiên cao nhất bị dừng lại để xử lý ngắt

b)

Task có độ ưu tiên thấp nhất bị dừng lại để xử lý ngắt

c)

Tất cả các Task bị dừng lại để xử lý ngắt

d)

Các Task tiếp tục chạy cho đến khi hoàn thành rồi mới xử lý ngắt

5.

Những biến nào sau đây được cấp phát bộ nhớ ngay khi khởi tạo chương trình (chọn 2)?

a)

char a;

b)

static uint32_t a;

c)

static uint8_t b;

d)

uint16_t a;

6.

Cú pháp nào sau đây là đúng để giải phóng một Semaphore xSema trong chương trình con phục vụ ngắt?

a)

xSemaphoreGiveFromISR(xSema);

b)

xSemaphoreGiveFromISR(0, xSema);

c)

xSemaphoreGiveFromISR(xSema, 1, 0);

d)

xSemaphoreGiveFromISR(xSema, 0);

7.

FreeRTOS cung cấp các file heap_1.c đến heap_5.c chứa các API hỗ trợ cấp phát bộ nhớ động. Người lập trình nên sử dụng hàm nào sau đây để cấp phát bộ nhớ động từ một trong các file heap trên để tối ưu bộ nhớ?

a)

pvPortMalloc() và vPortFree() từ heap_5.c

b)

pvPortMalloc() và vPortFree() từ heap_1.c

c)

pvPortMalloc() và vPortFree() từ heap_2.c

d)

pvPortMalloc() và vPortFree() từ heap_3.c

8.

Biến nào sau đây được cấp phát bộ nhớ ngay khi khởi tạo chương trình?

a)

unsigned int z;

b)

static uint16_t x;

c)

int t;

d)

uint8_t y;

9.

Khi đóng bộ ngắt với một Task bằng một Semaphore thì trong chương trình con phục vụ ngắt thường chứa câu lệnh nào?

a)

xBinarySemaphore = xSemaphoreCreateBinary();

b)

xSemaphoreGiveFromISR();

c)

xSemaphoreTake();

d)

xSemaphoreGive();

10.

Xét về góc độ cấp phát bộ nhớ, đâu là cú pháp đúng để khai báo một Task trong hệ điều hành FreeRTOS?

a)

void vTask1 (void *pvParameters);

b)

static void vTask1 (void *pvParameters);

c)

weak void vTask1 (void *pvParameters);

d)

volatile void vTask1 (void *pvParameters);

11.

Đâu là câu lệnh đúng để cấp phát vùng nhớ cho con trỏ p1 quản lý?

a)

int *p1; p1 = pvPortMalloc(200 * sizeof(unsigned int));

b)

int *p1; p1 = (int *)pvPortMalloc(200 * sizeof(p1));

c)

int *p1; p1 = (int)pvPortMalloc(200 * sizeof(unsigned int));

d)

int *p1; p1 = (int *)pvPortMalloc(200 * sizeof(unsigned int));

12.

Cho một phần tên chương trình con phục vụ ngắt trong bảng Vecto ngắt như sau: void WEAK_EXTI0_IRQHandler(void); void WEAK_EXTI1_IRQHandler(void); void WEAK_EXTI2_IRQHandler(void); void WEAK_EXTI3_IRQHandler(void); void WEAK_EXTI4_IRQHandler(void); void WEAK_EXTI9_5_IRQHandler(void); void WEAK_EXTI15_10_IRQHandler(void); Khi muốn xử lý ngắt xảy ra tại chân PA5, cần cài đặt nội dung cho chương trình con phục vụ ngắt nào?

a)

void WEAK_EXTI15_10_IRQHandler(void);

b)

void WEAK_EXTI4_IRQHandler(void);

c)

void WEAK_EXTI3_IRQHandler(void);

d)

void WEAK_EXTI9_5_IRQHandler(void);

13.

Cho một phần tên chương trình con phục vụ ngắt trong bảng Vecto ngắt như sau: void WEAK_EXTI0_IRQHandler(void); void WEAK_EXTI1_IRQHandler(void); void WEAK_EXTI2_IRQHandler(void); void WEAK_EXTI3_IRQHandler(void); void WEAK_EXTI4_IRQHandler(void); void WEAK_EXTI9_5_IRQHandler(void); void WEAK_EXTI15_10_IRQHandler(void); Khi muốn xử lý ngắt xảy ra tại chân P11, cần cài đặt nội dung cho chương trình con phục vụ ngắt nào?

a)

void WEAK_EXTI15_10_IRQHandler(void);

b)

void WEAK_EXTI4_IRQHandler(void);

c)

void WEAK_EXTI3_IRQHandler(void);

d)

void WEAK_EXTI9_5_IRQHandler(void);

14.

Đâu là cú pháp đúng để giải phóng một vùng nhớ được quản lý bởi con trỏ pArr như sau: int *pArr; pArr = (int *)pvPortMalloc(10 * sizeof(int));

a)

FreePort(pArr);

b)

vPortFree(*pArr);

c)

vPortFree(pArr);

d)

release(pArr);

15.

Hãy điền từ khóa phù hợp vào vị trí (1) trong câu lệnh sau để cấp phát một vùng nhớ gồm 1000 byte cho con trỏ pArr quản lý: int *pArr; pArr = (int *)pvPortMalloc(200 * ___(1)___ (unsigned int));

a)

sizeof

b)

free

c)

1000

d)

malloc

16.

Cho đoạn chương trình sau: int *pArr; pArr = (int *)pvPortMalloc(10 * sizeof(char)); Kết quả thực thi đoạn chương trình trên là:

a)

Đoạn chương trình chạy bình thường

b)

Lỗi vì kiểu dữ liệu không tương thích

c)

Con trỏ pArr trỏ đến vùng nhớ 20 byte

d)

Con trỏ pArr trỏ đến vùng nhớ 10 byte

17.

Cho các câu lệnh sau: int *pArr; pArr = (int *)pvPortMalloc(10 * sizeof(int)); Hãy cho biết đoạn chương trình trên cấp phát mấy byte trong bộ nhớ?

a)

40

b)

8

c)

20

d)

10

18.

Điền giá trị phù hợp vào vị trí (1) trong câu lệnh sau để cấp phát một vùng nhớ gồm 100 byte cho con trỏ pArr quản lý: int *pArr; pArr = (int *)pvPortMalloc(_(1)_ * sizeof(int));

a)

10

b)

20

c)

30

d)

50

19.

Điền kiểu dữ liệu phù hợp vào vị trí (1) trong câu lệnh sau để cấp phát một vùng nhớ nhớ gồm 200 byte cho con trỏ pArr quản lý: char *pArr; pArr = (char *)pvPortMalloc(200 * sizeof(__ (1) __));

a)

uint32_t

b)

int

c)

char

d)

unsigned int

20.

Cho nội dung một Task trong hệ điều hành FreeRTOS trên STM32F4 như sau: static void vLEDTask1(void *pvParameters) { while(1) { xSemaphoreTake(xSemaphore, 200); GPIOD->ODR |= ((uint16_t)0xF000); } } Hãy cho biết Task trên đặt các chân tín hiệu nào trên cổng D lên mức cao?

a)

Chân 8 đến 11

b)

Chân 16 đến 19

c)

Chân 12 đến 15

d)

Chân 4 đến 7

21.

Cho Task vLEDTask1 được đồng bộ với một ngắt có mã chương trình như sau: static void vLEDTask1(void *pvParameters) { while(1) { xSemaphoreTake(xSemaphore, portMAX_DELAY); GPIOD->ODR |= ((uint16_t)0xF000); } } Đâu là mô tả đúng về Task trên?

a)

Task này chạy bình thường

b)

Task này sẽ kết thúc khi có một sự kiện ngắt xảy ra

c)

Task này sẽ bị Block cho đến khi có một sự kiện ngắt xảy ra và giải phóng Semaphore

d)

Task này sẽ không bị Block cho đến khi có một sự kiện ngắt xảy ra và giải phóng Semaphore

22.

Cho đoạn chương trình sau: int *pArr; int i = 0; // Cấp phát bộ nhớ cho mảng số nguyên pArr = (int *)pvPortMalloc(10 * sizeof(int)); // Khởi tạo mảng với giá trị for (i = 0; i < 10; i++) { pArr[i] = i; } pArr++; pArr++; Hãy cho biết sau khi thực hiện đoạn chương trình trên, con trỏ pArr đang trỏ đến phần tử có giá trị là bao nhiêu trong bộ nhớ?

a)

1

b)

2

c)

3

d)

4

23.

Cho đoạn mã xử lý ngắt: if (EXTI_GetITStatus(EXTI_Line1) != RESET) { xSemaphoreGiveFromISR(xBinarySemaphore, pdFALSE); } /* Xóa ngắt */ EXTI_ClearITPendingBit(EXTI_Line1); Hãy cho biết chương trình trên xử lý ngắt xảy ra tại chân số mấy trên cổng vào/ra?

a)

Chân số 6

b)

Chân số 2

c)

Chân số 1

d)

Chân số 5

24.

Cho đoạn chương trình sau: void EXTI4_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line4) != RESET) { xSemaphoreGiveFromISR(xSemaphore, pdFALSE); } EXTI_ClearITPendingBit(EXTI_Line0); } static void vTask1(void *pvParameters) { while(1) { GPIOD->ODR |= ((uint16_t)0x1000); } } Đâu là mô tả đúng về mối quan hệ giữa Task vTask1 và chương trình con phục vụ ngắt EXTI4_IRQHandler?

a)

Khi có ngắt xảy ra trên Line 4, Task vTask1 sẽ chuyển sang trạng thái Block

b)

Task vTask1 được đồng bộ với chương trình con phục vụ ngắt EXTI4_IRQHandler qua Semaphore xSemaphore

c)

Khi có ngắt xảy ra trên Line 4, Task vTask1 sẽ chuyển sang trạng thái Unblock

d)

Task vTask1 không được đồng bộ với chương trình con phục vụ ngắt EXTI4_IRQHandler

25.

Cho chương trình con phục vụ ngắt như sau: void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { xSemaphoreGiveFromISR(xBinarySemaphore, pdFALSE); } /* Xóa ngắt */ EXTI_ClearITPendingBit(EXTI_Line0); } Hãy cho biết chương trình trên xử lý ngắt xảy ra tại chân số mấy trên cổng vào/ra?

a)

Chân số 6

b)

Chân số 1

c)

Chân số 2

d)

Chân số 0

26.

Câu nào sau đây mô tả đúng về chương trình xử lý ngắt trên?

a)

Chương trình không giải phóng Semaphore

b)

Chương trình sai vì xử lý ngắt trên Line 1 nhưng lại kiểm tra cờ ngắt trên một Line khác

c)

Chương trình chạy bình thường

d)

Chương trình chưa xóa cờ ngắt sau khi đã xử lý ngắt xong

27.

Cho đoạn chương trình sau: xSemaphoreHandle xSemaphore = xSemaphoreCreateBinary(); void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { xSemaphoreGiveFromISR(xSemaphore, pdFALSE); } EXTI_ClearITPendingBit(EXTI_Line0); } static void vTask1(void *pvParameters) { while(1) { — (1) — (xSemaphore, 100); GPIOD->ODR |= ((uint16_t)0xF000); } } Cần điền API nào vào vị trí (1) để đồng bộ Task vTask1 với chương trình con phục vụ ngắt EXTI0_IRQHandler bằng một Semaphore?

a)

xSemaphoreTake

b)

xSemaphoreGiveFromISR

c)

xSemaphoreGive

d)

xSemaphore

28.

Cho đoạn chương trình sau: xSemaphoreHandle xSemaphore = xSemaphoreCreateBinary(); void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { xSemaphoreGiveFromISR(xSemaphore, pdFALSE); } EXTI_ClearITPendingBit(EXTI_Line0); } static void vTask1(void *pvParameters) { while(1) { xSemaphoreTake( — (1) — , 100); GPIOD->ODR |= ((uint16_t)0xF000); } } Cần điền giá trị nào vào vị trí (1) để đồng bộ Task vTask1 với chương trình con phục vụ ngắt EXTI0_IRQHandler bằng một Semaphore?

a)

xSemaphoreGiveFromISR

b)

xSemaphoreTake

c)

xSemaphore

d)

xSemaphoreGive

29.

Cho đoạn chương trình sau: void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { xSemaphoreGiveFromISR(xBinarySemaphore, pdFALSE); } EXTI_ClearITPendingBit(EXTI_Line0); } static void vLEDTask1(void *pvParameters) { while(1) { xSemaphoreTake(xBinarySemaphore, portMAX_DELAY); GPIOD->ODR |= ((uint16_t)0xE000); } } static void vLEDTask2(void *pvParameters) { while(1) { GPIOD->ODR |= ((uint16_t)0x1000); } } Hãy cho biết khi có ngắt xảy ra trên Line0 thì Task nào sẽ thoát khỏi trạng thái Block?

a)

Không có Task nào

b)

vLEDTask1

c)

vLEDTask2

d)

Cả hai Task vLEDTask1 và vLEDTask2