Очередная пачка глупых вопросов про С++ (потом сотрёте)

-NMi-
Offline
Зарегистрирован: 20.08.2018

Конечно, хотелось бы услышать Евгения и Дракулу.

Речь будет только о 32х битной платформе, вслучечо...

Вопрос номер раз: как обратиться, допустим, по адресу 0x1fffe000 и не схватить Hard Fault.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

-NMi- пишет:

Вопрос номер раз: как обратиться, допустим, по адресу 0x1fffe000 и не схватить Hard Fault.

Обернуть в исключение

rkit
Offline
Зарегистрирован: 23.11.2016

Что значит "обратиться по адресу"?

В С++ нет понятия "Hard Fault"

__Alexander
Offline
Зарегистрирован: 24.10.2012

rkit пишет:

Что значит "обратиться по адресу"?

В С++ нет понятия "Hard Fault"

И при чем тут Си? Контроллер сам впадает в эту ошибку, если что-то пошло не так (аппаратно). Вы читаете значение по адресу, которого реально не существует и идете нахер в Hard Fault. Что Си, что хуеси... программа уже во флеш и не имеет значения на чем она написана.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я конечно не спец по си, но например в Linux при кривизна кода прога просто зависает, в stm32 никаких hard fault тоже не видел, тупо зависание, внешних отладчиков не подключено, видимо поэтому широко разрекламированных hard fault не видел.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

rkit пишет:

Что значит "обратиться по адресу"?

Старшая половина адреса - CAS - младшая половина адреса - RAS - ну а дальше - работа с шиной данных в зависимости от WE.

Цитата:

В С++ нет понятия "Hard Fault"

Ну так RAS и CAS - тоже нет.

Есть такое понятие: "аппаратно". А потому от языка программирования не зависит. Совсем.

mixail844
Offline
Зарегистрирован: 30.04.2012
я , вообще не до конца понимаю сути вопроса , точнее вроде понимаю что хочет узнать автор , но не понимаю как он это спрашивает.
 
сейчас работаю с камнем stm32L4 (cortex m4) , 
вот пример из кода для подсчета контрольной суммы : 
 
#define CRC_ADDR				(FLASH_END - 3)
#define CRC_CALC_SIZE			((2 * 1024 * 1024) - 4)
#define CRC_UNTOUCHED			(uint32_t)(0xFFFFFFFF)



bool CheckFlashIntergrity(void)
{
	uint8_t *crc_addr = (uint8_t*)(uint32_t*)CRC_ADDR;
	uint32_t strd_crc = *(uint32_t*)crc_addr;
	if(strd_crc == CRC_UNTOUCHED)
	{
		return true;
	}
	uint8_t *start = (uint8_t*)(uint32_t*)FLASH_BASE;
	volatile uint32_t flash_size = (uint32_t)g_pfnVectors[7]; // access to value in g_pfnVectors which stores FW size
	volatile uint32_t clcd_crc = _calcCRC32(start, flash_size);
	return (strd_crc == clcd_crc);
}
считывается "весь" флеш без всяких проблем.
 
потом можно полезть в datasheet на контроллер и глянуть куда можно обращатья а куда низя
 
-NMi-
Offline
Зарегистрирован: 20.08.2018

Дык вот в том то и прикол, что на авр можно обращаться куда угодно и сколько угодно. На стм32 на эстм такой финт ушами никанает)))

rkit
Offline
Зарегистрирован: 23.11.2016

andriano пишет:

Ну так RAS и CAS - тоже нет.

Но ты зачем-то приплел

__Alexander
Offline
Зарегистрирован: 24.10.2012

-NMi- пишет:
Дык вот в том то и прикол, что на авр можно обращаться куда угодно и сколько угодно. На стм32 на эстм такой финт ушами никанает)))

avr 8 бит, стм 32 бита, т.е четыре по восемь. Если соблюдать кратность четырем, то ничего плохого не произойдет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

rkit пишет:

andriano пишет:

Ну так RAS и CAS - тоже нет.

Но ты зачем-то приплел

Но ведь кто-то перед этим зачем-то приплел С++ к "обратиться по адресу".

rkit
Offline
Зарегистрирован: 23.11.2016

Кто-то прочитал вопрос, в отличие от половины этой темы.

-NMi-
Offline
Зарегистрирован: 20.08.2018

На AVR платформе можно читать и писать куда угодно и ничего криминального не будет. А на STM32 больно-то не разгонишься, всё строго по правилам кристалла. Посему не нужно сравнивать AVR c STM   !!!