Font size
WorksheetsBài tập FreeRTOS và cấp phát bộ nhớ (Worksheet)
Total questions: 29
Worksheet time: 15mins
Các biến cục bộ bên trong một hàm được cấp phát như thế nào?
Được cấp phát ngay khi khởi tạo chương trình trong không gian cố định
Được cấp phát động trong vùng bất kỳ của RAM
Được cấp phát như các biến toàn cục
Thường được cấp phát động trong vùng heap khi hàm được gọi
Đâu là mô tả đúng về một hàm được khai báo static?
Vùng mà dành cho hàm sẽ được cấp phát ngay khi hàm được gọi
Hàm này không được chứa các biến cục bộ
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
Vùng mà dành cho hàm luôn nhỏ hơn 1KB
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?
Biến được khai báo kiểu int
Biến được khai báo bởi từ khóa static
Biến được khai báo kiểu char
Biến được khai báo bởi từ khóa volatile
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?
Task có độ ưu tiên cao nhất bị dừng lại để xử lý ngắt
Task có độ ưu tiên thấp nhất bị dừng lại để xử lý ngắt
Tất cả các Task bị dừng lại để xử lý ngắt
Các Task tiếp tục chạy cho đến khi hoàn thành rồi mới xử lý ngắt
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)?
char a;
static uint32_t a;
static uint8_t b;
uint16_t a;
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?
xSemaphoreGiveFromISR(xSema);
xSemaphoreGiveFromISR(0, xSema);
xSemaphoreGiveFromISR(xSema, 1, 0);
xSemaphoreGiveFromISR(xSema, 0);
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ớ?
pvPortMalloc() và vPortFree() từ heap_5.c
pvPortMalloc() và vPortFree() từ heap_1.c
pvPortMalloc() và vPortFree() từ heap_2.c
pvPortMalloc() và vPortFree() từ heap_3.c
Biến nào sau đây được cấp phát bộ nhớ ngay khi khởi tạo chương trình?
unsigned int z;
static uint16_t x;
int t;
uint8_t y;
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?
xBinarySemaphore = xSemaphoreCreateBinary();
xSemaphoreGiveFromISR();
xSemaphoreTake();
xSemaphoreGive();
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?
void vTask1 (void *pvParameters);
static void vTask1 (void *pvParameters);
weak void vTask1 (void *pvParameters);
volatile void vTask1 (void *pvParameters);
Đâu là câu lệnh đúng để cấp phát vùng nhớ cho con trỏ p1 quản lý?
int *p1; p1 = pvPortMalloc(200 * sizeof(unsigned int));
int *p1; p1 = (int *)pvPortMalloc(200 * sizeof(p1));
int *p1; p1 = (int)pvPortMalloc(200 * sizeof(unsigned int));
int *p1; p1 = (int *)pvPortMalloc(200 * sizeof(unsigned int));
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?
void WEAK_EXTI15_10_IRQHandler(void);
void WEAK_EXTI4_IRQHandler(void);
void WEAK_EXTI3_IRQHandler(void);
void WEAK_EXTI9_5_IRQHandler(void);
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?
void WEAK_EXTI15_10_IRQHandler(void);
void WEAK_EXTI4_IRQHandler(void);
void WEAK_EXTI3_IRQHandler(void);
void WEAK_EXTI9_5_IRQHandler(void);
Đâ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));
FreePort(pArr);
vPortFree(*pArr);
vPortFree(pArr);
release(pArr);
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));
sizeof
free
1000
malloc
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à:
Đoạn chương trình chạy bình thường
Lỗi vì kiểu dữ liệu không tương thích
Con trỏ pArr trỏ đến vùng nhớ 20 byte
Con trỏ pArr trỏ đến vùng nhớ 10 byte
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ớ?
40
8
20
10
Đ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));
10
20
30
50
Đ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) __));
uint32_t
int
char
unsigned int
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?
Chân 8 đến 11
Chân 16 đến 19
Chân 12 đến 15
Chân 4 đến 7
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?
Task này chạy bình thường
Task này sẽ kết thúc khi có một sự kiện ngắt xảy ra
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
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
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ớ?
1
2
3
4
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?
Chân số 6
Chân số 2
Chân số 1
Chân số 5
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?
Khi có ngắt xảy ra trên Line 4, Task vTask1 sẽ chuyển sang trạng thái Block
Task vTask1 được đồng bộ với chương trình con phục vụ ngắt EXTI4_IRQHandler qua Semaphore xSemaphore
Khi có ngắt xảy ra trên Line 4, Task vTask1 sẽ chuyển sang trạng thái Unblock
Task vTask1 không được đồng bộ với chương trình con phục vụ ngắt EXTI4_IRQHandler
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?
Chân số 6
Chân số 1
Chân số 2
Chân số 0
Câu nào sau đây mô tả đúng về chương trình xử lý ngắt trên?
Chương trình không giải phóng Semaphore
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
Chương trình chạy bình thường
Chương trình chưa xóa cờ ngắt sau khi đã xử lý ngắt xong
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?
xSemaphoreTake
xSemaphoreGiveFromISR
xSemaphoreGive
xSemaphore
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?
xSemaphoreGiveFromISR
xSemaphoreTake
xSemaphore
xSemaphoreGive
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?
Không có Task nào
vLEDTask1
vLEDTask2
Cả hai Task vLEDTask1 và vLEDTask2
