You are on page 1of 6

ĐỀ THI CUỐI KỲ - HK2 NĂM HỌC 2016/2017

MÔN THI: LẬP TRÌNH NHÚNG

TG: 90 PHÚT

(SV không làm bài trên đề thi)

Câu 1) (2 đ)

Viết hàm revbits nhận vào 1 tham số kiểu char và trả về kết quả kiểu char có giá trị là đảo vị trí các bit của tham số.

om
Giải thích: Tham số có giá trị nhị phân là b7b6b5b4b3b2b1b0 thì kết quả là b0b1b2b3b4b5b6b7

Hướng dẫn: Sử dụng các phép toán dịch bit, AND, OR.

.c
Câu 2) (2đ)

ng
a) Viết hàm void initPortA(void) khởi động PORTA với PA3...0 là input, PA7...4 là output sử dụng thư viện
co
TIVAware
an

void initPortA(void){
th

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//kich hoat port A


GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_7| GPIO_PIN_6|
ng

GPIO_PIN_5| GPIO_PIN_4);
o

GPOIPinTypeGPIOInput(GPIO_PORTA_BASE,GPIO_PIN_3| GPIO_PIN_2|
du

GPIO_PIN_1| GPIO_PIN_0);
u

GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO_PIN_3| GPIO_PIN_2|
cu

GPIO_PIN_1| GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);


}
a) Viết hàm void updateOutput(void) xuất giá trị đảo của PA3...0 ra PA7...4.

Ví dụ PA3...0 là 1100 thì PA7...4 sẽ là 0011

Void updateOutput(void){
Uint8_t Data=0;
If (!GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_3))
Data = Data |1;
If (!GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2))
Data = Data |2;

CuuDuongThanCong.com https://fb.com/tailieudientucntt
If (!GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_1))
Data = Data |4;
If (!GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0))
Data = Data |8;
GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_7| GPIO_PIN_6| GPIO_PIN_5|
GPIO_PIN_4, Data);
}
Cách 2:

void updateOutput(void){
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_3)==0)

om
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7, 1<<7);
else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_7, 0);

.c
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_2)==0)

ng
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, 1<<6);
else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, 0);
co
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_1)==0)
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 1<<5);
an

else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0);


th

if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0)==0)
ng

GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 1<<4);


else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0);
o
du

Câu 3) (2đ)
u
cu

Cho 3 hàm void Task1(void), void Task2(void), void Task3(void). Ba hàm này có timing như sau:

Task 1 chạy sau mỗi 40 ms. Task 2 chạy sau mỗi 50 ms. Task 3 chạy sau mỗi 60 ms.

a) Viết hàm void initSystick(void) khởi động Systick Timer với chu kỳ 1 ms.

Void initSystick(void)
{
SysTickPeriodSet(SysCtlClockGet()/1000);
IntMasterEnable();
SysTickIntEnable();
SysTickEnable();

CuuDuongThanCong.com https://fb.com/tailieudientucntt
}

b) Viết chương trình thực hiện 3 tác vụ trên với timing đã đặt ra và SystickTimer như câu a. (Chỉ viết chương trình
phục vụ ngắt Systick và vòng lặp chính, đồng thời khai báo các biến toàn cục cần thiết)

//Khai báo các biến cần thiết ở đây

Unsigned long g_ulCounter1=0; g_ulCounter2=0; g_ulCounter3=0;


void SystickISRHandler()
{
//write the code here

om
g_ulCounter1++;
g_ulCounter2++;

.c
g_ulCounter3++;

ng
} co
int main(void)
{
an

while(1)
th

{
ng

If(g_ulCounter1 == 40) {Task1(); g_ulCounter1=0;}


If(g_ulCounter2==50) {Task2(); g_ulCounter2=0;}
o
du

If(g_ulCounter3==60) {Task3();g_ulCounter3=0);}
}
u
cu

Cách 2:

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
void SystickISRHandler(){
static int counter;
counter ++;
if(counter == 40){
flag1 = 1;
}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
if(counter == 50){
flag2 = 1;
}
if(counter == 60){
flag3 = 1;
counter = 0;
}
}
int main (void){
while(1){
if (flag1 == 1){

om
flag1 = 0;

.c
Task1();
}

ng
if (flag2 == 1){ co
flag2 = 0;
Task2();
an

}
th

if (flag3 == 1){
flag3 = 0;
ng

Task3();
o

}
du

}
}
u
cu

Câu 4: (2đ)

Vi điều khiển ARM TIVA123C muốn truyền dữ liệu sử dụng mã hóa Manchester. Một tín hiệu Clock được đưa vào
chân PA0, tín hiệu mã hóa xuất ra trên PA1. Mã hóa manchester được thực thi bằng cách: Clock XOR Data =
Manchester Output

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Viết hàm Manchester(unsigned char Data) để mã hóa và xuất dữ liệu mã hóa ra PA1, bit truyền đầu tiên là bit có
trọng số cao nhất.

Để truyền 1 bit, quá trình như sau:

//Lay 1 bit du lieu

om
//For (int i = 7, i=0, i--)

.c
//{Data1 = data>>i;

ng
//Data1=Data1 & 1; co
 Chờ cho clock lên 1
an

While(!GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0);
 Đưa giá trị Data XOR Clock ra PA1
th

Data = Data ^ 1;
ng

 Chờ cho Clock xuống 0


While(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0);
o
du

 Đưa giá trị Data XOR CLock ra PA1


Data=Data^0;
u
cu

Lặp lại quá trình cho cả 8 bit để truyền byte Data đi

Chú ý: Coi như các chân port đã được khởi động. Sử dụng các hàm của thư viện TivaWare để đọc/ghi port.

Manchester(unsigned char Data){


uint8_t Data1, Data2;
for (int i=7, i=0, i--){
Data1 = Data>>i;
Data1 = Data1 & 1;
While(!GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0);
Data2 = Data1 ^ 1;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_1, Data2);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
While(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0);
Data2 = Data1 ^ 0;
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_1, Data2);
}
}
Câu 5) (2đ)

Cho các khai báo sau của một chương trình dùng FreeRTOS

xQueueHandle myQueue// our queue

message_t MyMessage; // variable for a message (not a pointer!)

om
portBASE_TYPE Result; // result of the operation

.c
portBASE_TYPE pxHigherPriorityTaskWoken ;

ng
a) Viết lệnh khởi tạo myQueue có thể chứa 5 phần tử, mỗi phần tử có kiểu message_t
co
myQueue = xQueueCreate(5, sizeof(message_t));
an

b) Viết lệnh ghi nội dung của biến MyMessage vào Myqueue trong một tác vụ (không phải trình phục vụ ngắt),
th

thời gian chờ là 1000 lần ngắt Systick.


ng

Result xQueueSend(MyQueue, &MyMessage ,1000);


o

c) Viết lệnh đọc một giá trị từ Myqueue vào biến MyMessage trong ISR
du

pxHigherPriorityTaskWoken xQueueReceive(myQueue,&MyMessage,1000);
u
cu

d) Trong 1 ISR ta gọi lệnh xSemaphoreGiveFromISR( xCountingSemaphore, &xHigherPriorityTaskWoken );

Khi nào biến xHigherPriorityTaskWoken mang giá trị TRUE?

Nếu gọi lệnh xSe…. Làm tác vụ có ưu tiên cao hơn tác vụ hiện hành ra khỏi blocked, sẽ là TRUE

CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like