CEVA DSP – צוות Video Codec

מאת JobHunt

תאריך: 

1. כתוב תוכנית ב-C שתגיד האם המערכת שאתה עובד בה היא big endian או little endian.

פתרון:

קוד: בחר הכל

int endian()

{

long int *buff;

short int i;

buff = (long*) malloc(sizeof(long));

*buff = 1;

(char) i = *buff;

if (i == 1)

{

return 1;//little

}

else

{

return 0; //big

}

}

2. ברשותך מעבד שתומך בפקודות הבאות:

mac(x,y,z) = x*y+z

H(Rx) = high bits of reg Rx

L(Rx) = low bits of Rx

המעבד יכול לבצע 2 פקודות במחזור.

לרשותך כמה רגיסטרים שתצטרך.

ממש את הפונקציה הבאה:

( ( (a – b)<<2 ) + c – d + 4)>>3

תוך שימוש בפקודות ובקבועי int.

פתרון:

פנים הסוגריים זה קל למימוש. הטריק של החלוקה ב-8 (3<<) הוא להזיז את ה-low bits של פיתרון פנים הסוגרים ב-13 (כלומר כפל ב-2^13) ולקחת את ה-high bits (אין גלישה כי מדובר על חיבור וכפל של int).

אם פותחים את הסוגריים בצורה הבאה למשל:

קוד: בחר הכל

(a – b)*2^15 + (c – d + 4)*2^13

ניתן לממש ב-3 מחזורים:

קוד: בחר הכל

R5 = mac(b, -1, a) || R6 = mac(d, -1, c)

R7 = mac(R5, 2^15, 0) || R8 = mac(R6, 1, 4)

R9 = mac(R8, 2^13, R7)

והתוצאה נמצאת ב-H(R9).