Forth http://fforum.winglion.ru/ |
|
*Помогите найти объем памяти http://fforum.winglion.ru/viewtopic.php?f=19&t=2856 |
Страница 1 из 1 |
Автор: | mOleg [ Чт июн 14, 2012 18:48 ] |
Заголовок сообщения: | *Помогите найти объем памяти |
Подарили мне микросхему памяти, да не простую а с данными случаными, только забыли сообщить, каков у нее объем, а узнать, сколько же места в ней хочется. Чтение из нее последовательное, можно за раз только один бить прочесть, и перебирать адреса в ней можно только по одному биту (либо бит влево, либо бит вправо), соответсвенно читать и писать можно, но только в текущее положение. Помогите достоверно определить, сколько же памяти мне подарили. : сколькобит ( --> # ) так как микросхему подарили только мне, то проверить алгоритм можно только с помощью следующего кода-симулятора: TIMER@ D>S 137 MOD ABS BEGIN RANDOM DROP *WHILE 1 - REPEAT DROP вместо xxx подставить случайные числа, массив проинициализировать случайным содержимым. Размер любой в диапазоне от одной ячейки до 1 Гигабита. Обратите внимание на то, что адресация закольцована, т.е. перейдя последний бит попадаем в первый, и наоборот. *поправил код симулятора памяти |
Автор: | вопрос [ Чт июн 14, 2012 19:36 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
если диапазон до 1 гигабита, обнуляем более 1 гигабита и затем устанавливаем единственную единичную ячейку - бит и затем движемся по кругу :ищем её, длина пути поиска и будет объём памяти "не простую а с данными случаными" |
Автор: | WingLion [ Чт июн 14, 2012 19:43 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
А считать всю память реально? 1. N=0 2. Читаем 2^N бит, запоминаем, 3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит. 4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3 Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти. 5. Читаем все остальное до предполагаемого предела - 1Гбита, проверяя, что все остальные данные повторяются. Если появляются неповторяющиеся данные - увеличивать N на единицу и снова на п.3. Если есть подозрения, что память больше 1Гбит, повторять до нового предполагаемого предела. Если информацию в памяти сохранять не надо, Проверить можно и так: 1. Пишем с начала последовательные двоичные числа разрядности скажем 256, начиная с нуля затем пробегаем 2^N бит вперед, пишем дальше следующее число, возвращаемся назад na 2^N бит и проверяем, что там оказалось. Если нуль, увеличиваем N на 1 и пишем дальше числа, возвращаясь назад каждый раз, когда адрес достигает степени двойки, пока первый ноль не окажется затерт. p.s. первый вариант алгоритма когда-то использовал для проверки объема прошитых ПЗУ-шек, вставляемых в программатор. |
Автор: | mOleg [ Чт июн 14, 2012 19:51 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
WingLion писал(а): 2. Читаем 2^N бит, запоминаем, и, вот, скажем размер 1 бит WingLion писал(а): 3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит. WingLion писал(а): а там случайно, скажем значение "101010101010101010", или другое регулярное WingLion писал(а): 4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти. скажем, размер памяти - простое число |
Автор: | WingLion [ Чт июн 14, 2012 20:35 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
Код: : вперед вправо ; : назад влево ; : записать-0 прочесть IF изменить THEN ; : записать-1 записать-0 изменить ; : вперед-NN 0 DO вперед LOOP ; : назад-NN 0 DO назад LOOP ; 0 VALUE NN : тест-NN ( NN --> ) 1 TO NN записать-0 BEGIN NN вперед-NN записать-1 NN назад-NN прочесть IF EXIT THEN NN вперед-NN записать-0 NN назад-NN NN 1 + TO NN AGAIN ; : сколькобит тест-NN NN ; вилами по воде не проверено(!) |
Автор: | mOleg [ Пт июн 15, 2012 14:58 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
решение WingLion не верно, прошу исправить (должно хотя бы компилироваться и соответсвтовать условию задачи, а, желательно, и работать). WingLion писал(а): вилами по воде не проверено(!) нет смысла выкладывать заведомо нерабочие решения, т.к. сюда смотрят новички!!! Двум персонажам вынес предупреждение по пункту 6 правил данного раздела, мусорные сообщения вынес в отдельный топик. |
Автор: | chu [ Сб июн 16, 2012 08:26 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
Код: : сколькобит ( -- u ) 0 записать-0 begin 1+ dup вперед-NN записать-1 dup назад-NN прочесть until ; если на микросхеме есть маркировка, то можно погуглить даташит |
Автор: | mOleg [ Сб июн 16, 2012 19:16 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
Самое простое и медленное решение (использован fork) Кто придумает быстрее? source file: ramsize.fts |
Автор: | mOleg [ Сб июн 16, 2012 21:10 ] |
Заголовок сообщения: | Re: *Помогите найти объем памяти |
более быстое решение (опять fork) source file: ramsize1.fts |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |