מה דעתכם?

yair24

Member
מה דעתכם?

יש לי שני רעיונות ואני צריך לדעת מה להחליט: אני צריך לכתוב בית לזיכרון מסוים. הבעיה שלא תמיד הבית נכתב נכון, לפעמים יש רעשים בקו וביט יכול לקפוץ מ0 ל1 רעיון 1: פונקציה: כתיבה לזיכרון קריאה חזרה השוואה בין הבית שנכתב לבית שנקרא אם הם שווים (טוב) הפונקציה מחזירה TRUE אם הם לא שוים (לא טוב) הפונקציה מחזירה FALSE רעיון 2: פונקציה: כתיבה לזיכרון קריאה חזרה השוואה בין הבית שנכתב לבית שנקרא אם הם שווים (טוב) הפונקציה מחזירה TRUE כל עוד הם לא שוים (לא טוב) הפונקציה כותבת שוב וקוראת שוב ומשווה שוב 5 פעמים. אם 5 פעמים היתה שגיאה (ההשוואה לא נכונה) הפונקציה מחזירה FALSE המטרה היא לכתוב מעין פונקציית API לכתיבה לזיכרון המסוים הזה. מה לדעתכם יותר נכון ולמה? יאיר
 

yair24

Member
ולא על זה השאלה:

השאלה היא מה כדאי לעשות בפונקציה מהסוג הזה: האם כדאי שאת ה5 ניסיונות כתיבה נבצע בתוך הפונקציה? או אולי עדיף דוקא לתת למשתמש להחליט אם הוא רוצה לעשות את 5 הפעמים בעצמו. יאיר
 
בכל מקרה

זה לא פתרון טוב לדעתי, כי כמו שכתיבה עלולה לא להצליח, גם קריאה עלולה לא להצליח בגלל הבעיות בקו. תאר לעצמך, שגם הכתיבה לא הצליחה וגם הקריאה לא הצליחה: הפונקציה שלך תחזיר TRUE!!!!! וזה לא משנה כמה פעמים תקרא לה: פעם אחת או 100 פעמים. לכן אני שואל שוב: מדוע להשתמש בשיטה הזו? מה רע בשיטות מוכרות כמו CRC? למה הן לא עובדות כאן?
 

yair24

Member
תראה יש לי CRC

אבל בגלל סיבה מסוימת אני צריך להוציא שתי בתים מסוימים מחוץ לCRC ולכתוב אותם בנפרד מבין? אז צריך רעיון אחר וזה הרעיון. בכל מקרה אני כבר החלטתי על הרעיון השני. וזה לא נכון שזה לא משנה כמה פעמים אני אקרא לה 1 או 100: יכול להיות שבפעם הראשונה היתה הפרעה על הקו אבל בקריאה השניה לא תהיה ההפרעה ובטח בפעם ה5 לא תהיה... גם בCRC יכולים להיות פאקים כאלו: תאר לך שביט אחד עולה מפה וביט אחר יורד משם אז הCHECKSUM נשאר אותו דבר נכון? תודה. יאיר
 
טעות....

אם בפעם הראשונה תהיה לך הפרעה על הקו, אז מי מבטיח לך שלא תהיה הפרעה על הקו גם בקריאה??? נניח ושלחת 1 והוא הגיע 0. אח"כ ניסית לקרוא אותו (ושוב היתה הפרעה) וקיבלת 1. לפי השיטה שלך, הכל בסיידר, כי שלחת 1 וקיבלת בחזרה 1. אבל בזיכרון כתוב 0. קפיש? אם אתה רוצה, עבור 2 בתים סה"כ, אתה יכול להשתמש ב-PARITY או במטריצת PARITY (שכחתי את השם הטכני). אופציה נוספת: שלח את 2 הבתים בכמה עותקים. כלומר, במקום לשלוח 2 בתים, שלח 10 בתים (הם חוזרים 5 פעמים). כך, תוכל להשוות את העותקים בצד המקבל. אם הם כולם זהים, אז הסבירות גבוהה מאוד שהכל עבר נכון. אם אחד מהעותקים שונה, אז שדר עוד סט של בתים - כך, עד שכולם יהיו זהים. למען הסר ספק, זה שונה מאוד ממה שאתה הצעת, כי הבדיקה נעשית ישירות מול הזיכרון ולא דרך תווך התקשורת. ובאופן כללי לגבי CRC, הסיכוי ששני ביטים שמחליפים ערך, יצרו אותו CRC הוא 1 לכמה עשרות מיליארדים. וזאת כי CRC הוא פולינום בנוי היטב, כדי לטפל בדיוק בדברים האלה.
 

yair24

Member
אבל למה?

אני סומך על זה שלא כל פעם יש הפרעה על הקו. אתה טוען שתמיד יש הפרעה על הקו. הדבר היחיד שאני יודע זה הדבר הבא: עשיתי תוכנית שבודקת כמה שגיאות יש בכתיבה והיה כל 3 כתיבות שגיאה, אחר כך עשיתי תוכנית שכותבת וקוראת 5 פעמים והשגיאות הפסיקו לגמרי. אותה תוצאה קיבלתי גם בעזרת CHECKSUM אז אני לא יודע מה גרם לשגיאות אבל אני יודע שבאמת תמיד זה היה ביט אחד, בגלל שראיתי את התוצאה. אז ככה שהבדיקה של ה 5 פעמים מספקת אותי במקרה הזה. יאיר
 
לאאאא.....

אני טוען, שהפונקציה שלך תחזיר TRUE מתי שהיא אמורה להחזיר FALSE.... וזאת בעיה מאוד חמורה... אני מנחש שזו גם הסיבה שהשגיאות הפסיקו. זו צרה גדולה יותר מאשר השגיאה עצמה! אני לא יודע מה לומר לך לגבי העובדה שזה תמיד ביט אחד.... לא יודע מאיפה זה מגיע. אם אתה בטוח שזה המצב (או שבאופן כללי תמיד מדובר במספר איזוגי של ביטים), אתה יכול להשתמש בביט PARITY כדי לפתור לעצמך את הבעיה באופן מוחלט. אני מניח שאתה מכיר את הרעיון... זה אומר שאתה סה"כ שולח עוד ביט אחד בנוסף ל-2 הבתים שאתה כבר שולח. ואז אתה גם לא צריך לקרוא בחזרה את מה שכתבת וכו´.
 
למעלה