powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм поиска битых блоков в памяти
16 сообщений из 16, страница 1 из 1
Алгоритм поиска битых блоков в памяти
    #39806037
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть NAND FLASH память которая организованна блоками и в каждом блоке 64 страницы.
Память приходит с заводскими битыми блоками (bad blocks) а также битые блоки могут появиться в процессе работы.
Правильно ли я сделал алгоритм поиска следующего хорошего блока?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
uint32_t NFLASH_BadBlockSet(uint32_t block_num)
{
	uint32_t l_size = sizeof(bad_blocks_flags);
	uint32_t arr_index = block_num / 8;
	uint32_t bit_index = block_num % 8;

	if (arr_index > l_size)
		return NAND_FLASH_ERROR;

	bad_blocks_flags[arr_index] |= (1<<bit_index);

	return NAND_FLASH_OK;
}

uint32_t NFLASH_BadBlockGet(uint32_t block_num)
{
	uint32_t l_size = sizeof(bad_blocks_flags);
	uint32_t arr_index = block_num / 8;
	uint32_t bit_index = block_num% 8;

	if (arr_index > l_size)
		return NAND_FLASH_ERROR;

	if (bad_blocks_flags[arr_index] & (1<<bit_index))
		return NAND_FLASH_BAD_BLOCK;

	return NAND_FLASH_OK;
}

uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
	uint32_t block = start_block;
	uint32_t test;

	while (block < max_blocks)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) == NAND_FLASH_BAD_BLOCK)
			block++;
		else
		{
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status != NAND_FLASH_OK)
			{
				//save the bad block in the table
				NFLASH_BadBlockSet(block);
				block++;
			}
			else
				return block; //next good block
		}
	}

	return block;
}


я ничего не упустил?
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806040
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NFLASH_BadBlockGet() может вернуть NAND_FLASH_ERROR
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806056
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TNFLASH_BadBlockGet() может вернуть NAND_FLASH_ERROR
в принципе я сделал статический масив, так что выход индекса за границы можно исключить. а кроме этого можно принять алгоритм в качестве рабочего?

для симуляции я сделал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
    uint32_t block = start_block;

    while (block < max_blocks)
    {
	//find the next good block in the table
	if (NFLASH_BadBlockGet(block) == 2)
        {
            printf("bad block %d\n", block);
	    block++;
        }
	else
	{
	    //try to erase the block
	    //log_status = NFLASH_BlockErase(block);
	    //WAIT1_Waitms(BLOCK_ERASE_DELAY);

	    //if (log_status != NAND_FLASH_OK)
	    //{
		//save the bad block in the table
		//NFLASH_BadBlockSet(block);
		//block++;
            
             printf("good block %d\n", block);
             
            return block;
	}
    }

    return block;
}


void main (void)
{
     NFLASH_BadBlockSet(3);
     NFLASH_BadBlockSet(6);
     NFLASH_BadBlockSet(10);
     
     while (1)
     {
       
       g_block = BadBlocksScan(g_block, 12);
       
       g_block++;
       
     }

}



получил
good block 0
good block 1
good block 2
bad block 3
good block 4
good block 5
bad block 6
good block 7
good block 8
good block 9
bad block 10
good block 11

я правда не могу просимулирувать неудачное стирание блока.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806129
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверное даже так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
	uint32_t block = start_block;
	uint32_t test;

	while (block < max_blocks)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) == NAND_FLASH_BAD_BLOCK)
			block++;
		else
		{
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status != NAND_FLASH_OK)
			{
				//save the bad block in the table
				NFLASH_BadBlockSet(block);
				block++;
			}
			else
				return block; //next good block
		}
	}

	return 0;
}


если вышли за while значит overflow - вернуть начальный блок.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806264
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В целом нормально. Непонятно чем цикл for() не устроил?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
	for(uint32_t block = start_block; block < max_blocks; block++)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) != NAND_FLASH_BAD_BLOCK)
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status == NAND_FLASH_OK) return block; //next good block

			//save the bad block in the table
			NFLASH_BadBlockSet(block);
		}
	}
	return 0;
}
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806272
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВ целом нормально. Непонятно чем цикл for() не устроил?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
	for(uint32_t block = start_block; block < max_blocks; block++)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) != NAND_FLASH_BAD_BLOCK)
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status == NAND_FLASH_OK) return block; //next good block

			//save the bad block in the table
			NFLASH_BadBlockSet(block);
		}
	}
	return 0;
}


а что лучше с for? с for выглядит более... аккуратно я бы сказал.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806278
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7Dima TВ целом нормально. Непонятно чем цикл for() не устроил?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
	for(uint32_t block = start_block; block < max_blocks; block++)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) != NAND_FLASH_BAD_BLOCK)
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status == NAND_FLASH_OK) return block; //next good block

			//save the bad block in the table
			NFLASH_BadBlockSet(block);
		}
	}
	return 0;
}


а что лучше с for? с for выглядит более... аккуратно я бы сказал.
правда тут нет
if (NFLASH_BadBlockGet(block) == NAND_FLASH_BAD_BLOCK)
block++;
а я хочу проверить - может текущий блок уже записан в таблице битых блоков - в таком случае я не хочу пытаться выполнить команду стирания а сразу перейти к следующему блоку.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806280
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7с for выглядит более... аккуратно я бы сказал.
Этим и лучше. Код читабельнее, строк меньше.
По производительности одинаково.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806283
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7правда тут нет
if (NFLASH_BadBlockGet(block) == NAND_FLASH_BAD_BLOCK)
block++;
Смотри внимательнее.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806286
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7с for выглядит более... аккуратно я бы сказал.
Этим и лучше. Код читабельнее, строк меньше.
По производительности одинаково.
ааа. вижу. спасибо. как всегда круто :)
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806289
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И если правильно понимаю, то после NFLASH_BlockErase() надо ждать только если он вернул NAND_FLASH_OK.
Если так, то
Код: plaintext
1.
2.
3.
4.
		if(NFLASH_BlockErase(block) == NAND_FLASH_OK) {
			WAIT1_Waitms(BLOCK_ERASE_DELAY);
			return block; //next good block
		}
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806296
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИ если правильно понимаю, то после NFLASH_BlockErase() надо ждать только если он вернул NAND_FLASH_OK.
Если так, то
Код: plaintext
1.
2.
3.
4.
		if(NFLASH_BlockErase(block) == NAND_FLASH_OK) {
			WAIT1_Waitms(BLOCK_ERASE_DELAY);
			return block; //next good block
		}


нет. время стирания 2-4 милисекунды. вот я и жду после команды стирания.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806306
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного модифицировал - таблицу битых блоков нужно сохранить в микроконтролере.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
uint32_t BadBlocksScan(uint32_t start_block, uint32_t max_blocks)
{
    uint32_t bad_exists = 0;
 
	for(uint32_t block = start_block; block < max_blocks; block++)
	{
		//find the next good block in the table
		if (NFLASH_BadBlockGet(block) != NAND_FLASH_BAD_BLOCK)
			//try to erase the block
			log_status = NFLASH_BlockErase(block);
			WAIT1_Waitms(BLOCK_ERASE_DELAY);

			if (log_status == NAND_FLASH_OK) 
                        {
                            if (bad_exists)
                                SaveBadBlocksData();

                            return block; //next good block
                        }

			//save the bad block in the table
			NFLASH_BadBlockSet(block);
                        bad_exists = 1;
		}
	}
	return 0;
}
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806330
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TИ если правильно понимаю, то после NFLASH_BlockErase() надо ждать только если он вернул NAND_FLASH_OK.
Если так, то
Код: plaintext
1.
2.
3.
4.
		if(NFLASH_BlockErase(block) == NAND_FLASH_OK) {
			WAIT1_Waitms(BLOCK_ERASE_DELAY);
			return block; //next good block
		}


мда. механизм у меня был кривой. все работало почему то, но ожидание стирания было не там. поправил. как всегда снимаю шляпу, респект :)
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39806779
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понял, у тебя в bad_blocks_flags[arr_index] битовые маски. Да, экономит память.
А если сделать прозрачней:
bad_blocks[] сделать 2(1)-направленным списком?
И такой же список OK_blocks[].

Стал блок бэд - просто чикнул из второго списка и добавил в 1-й.
Поиск готового бэд - просто поиск в 1-м списке.
...
Рейтинг: 0 / 0
Алгоритм поиска битых блоков в памяти
    #39807208
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98Если правильно понял, у тебя в bad_blocks_flags[arr_index] битовые маски. Да, экономит память.
А если сделать прозрачней:
bad_blocks[] сделать 2(1)-направленным списком?
И такой же список OK_blocks[].

Стал блок бэд - просто чикнул из второго списка и добавил в 1-й.
Поиск готового бэд - просто поиск в 1-м списке.
не знаю насколько это оправданно. экономия по скорости незначительна.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм поиска битых блоков в памяти
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]