CEVA DSP – צוות Video Codec

תאריך: 

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).

CEVA DSP – חידות ושאלת אסמבלי

נתונים 2 קופסאות 2->1 שמקבלות שתי מספרים ומוציאות את המינימום ואת המקסימום בהתאמה.

בעזרת שתי הקופסאות האילו צריך לממש קופסה של 3->3 שממינת 3 מספרים.

האמת זה שאלה לא קשה.

זה ממש לא בעייה למצוא את המינימום ואת המקסימום. 

מה שהסתבכתי זה למצוא את המספר האמצעי. אבל אם חושבים על זה טוב פותרים גם את זה.

שאלה שנייה.

ממש קוד אסמבלי של פונקצייה שכופלת שני מספרים x,y

למשל foo(x,y)w (ה W זה כדי שיהיה כתב ברור )

כאשר נתונים רק 3 פקודות אסמבלי.

inc x

dec x

jnz label.

אילו שני סוגי קופסאות אחד של מינימום ואחת של מקסימום.

אבל מותר להשתמש בכל קוספה כמה פעמים שרוצים.

בעקרון צריך להשתמש ב- 3 לולאות ולייבלים ועם משתנה עזר:

לולאה 1 – עובדת על X

לולאה 2 – עובדת על Y

לולאה 3 – עובדת על Z שמקבלת את הערך המקורי של X