Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм поиска битых блоков в памяти / 16 сообщений из 16, страница 1 из 1
25.04.2019, 10:24
    #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
25.04.2019, 10:30
    #39806040
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска битых блоков в памяти
NFLASH_BadBlockGet() может вернуть NAND_FLASH_ERROR
...
Рейтинг: 0 / 0
25.04.2019, 11:00
    #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
25.04.2019, 12:02
    #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
25.04.2019, 14:12
    #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
25.04.2019, 14:28
    #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
25.04.2019, 14:32
    #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
25.04.2019, 14:33
    #39806280
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска битых блоков в памяти
jenya7с for выглядит более... аккуратно я бы сказал.
Этим и лучше. Код читабельнее, строк меньше.
По производительности одинаково.
...
Рейтинг: 0 / 0
25.04.2019, 14:34
    #39806283
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска битых блоков в памяти
jenya7правда тут нет
if (NFLASH_BadBlockGet(block) == NAND_FLASH_BAD_BLOCK)
block++;
Смотри внимательнее.
...
Рейтинг: 0 / 0
25.04.2019, 14:35
    #39806286
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска битых блоков в памяти
Dima Tjenya7с for выглядит более... аккуратно я бы сказал.
Этим и лучше. Код читабельнее, строк меньше.
По производительности одинаково.
ааа. вижу. спасибо. как всегда круто :)
...
Рейтинг: 0 / 0
25.04.2019, 14:39
    #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
25.04.2019, 14:47
    #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
25.04.2019, 14:57
    #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
25.04.2019, 15:24
    #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
26.04.2019, 13:32
    #39806779
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска битых блоков в памяти
Если правильно понял, у тебя в bad_blocks_flags[arr_index] битовые маски. Да, экономит память.
А если сделать прозрачней:
bad_blocks[] сделать 2(1)-направленным списком?
И такой же список OK_blocks[].

Стал блок бэд - просто чикнул из второго списка и добавил в 1-й.
Поиск готового бэд - просто поиск в 1-м списке.
...
Рейтинг: 0 / 0
27.04.2019, 20:07
    #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]