ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
12 июня
1523999 Топик полностью
Nikolay_Po (10.06.2025 17:40, просмотров: 101) ответил klen на ch32vxx: починил поддержку FreeRTOS в openocd для wch-riscv
Не работало с WCH-LinkE. Добавил одну строчку в wlinke.c: 

openocd-wch_LinkE_enabled.7z


Было:

		case 6:
		{
			riscvchip = 0x06;
			chipiaddr = 0x08000000;
			pagesize = 256;
			txbuf[3] = 0x03;
			len = 4;
			pWriteData(0, 1, txbuf, &len);
			len = 4;
			pReadData(0, 1, rxbuf, &len);
			break;
		}


Стало:

		case 6:
		case 0x86:
		{
			riscvchip = 0x06;
			chipiaddr = 0x08000000;
			pagesize = 256;
			txbuf[3] = 0x03;
			len = 4;
			pWriteData(0, 1, txbuf, &len);
			len = 4;
			pReadData(0, 1, rxbuf, &len);
			break;
		}

Почему-то при всей одинаковости обмена по USB при сравнении с WCH-Link-CH549, вместо 0x06, LinkE передаёт 0x86 - предположу, что единичка в старший бит байта в качестве какого-то флажка залетает.

И вообще, эта OpenOCD - глюкодром ещё тот.


С LTO компилятор и линкер очень глубоко копают. Без оптимизаций, всё собирается без предупреждений. Но с -O3 -flto=auto, получаю это:


In function 'cfi_command',
    inlined from 'cfi_command_val' at src/flash/nor/cfi.c:1101:2:
src/flash/nor/cfi.c:158:36: error: writing 8 bytes into a region of size 4 [-Werror=stringop-overflow=]
  158 |                         *cmd_buf++ = (i & (bank->chip_width - 1)) ? 0x0 : cmd;
      |                                    ^

Пишут в буфер с размером, заданным в байтах, а количество инкрементов соответствует количеству бит. И никого не парит, так как: "Выключи эту глючную LTO! Оно не работает!". Кроме этого факапа (попутаны байты с битами), ещё есть чипы с размером шины в 64 бита, а размер буфера задан 4 байта - для 32-битных таргетов. И это тоже LTO подсвечивает (уже после исправления байт на биты). И LTO это разматывает и ругается.

В этом месте я не разобрался - не очевидно, как оно должно быть, где в байтах, а где в битах? Но факт, что в массив размером в 4 байта делают как минимум 8 записей, а как максимум 64 - если target 64 бита. Пробовал привести в норму, но там во многих местах используется bank->bus_width, и нигде не подписано, оно в байтах или в битах. Хотя в дефайнах размеров в cfi.h указано 4 максимум - то есть байты, 32 бита (при поддержке архитектур с 64 битами). И LTO блюдёт и ругается благим матом.