Перейти к содержанию
    

обращение по нулевому адресу...

вот код

typedef struct
{
    int z;
    int d;
} EE;
EE* sw;
volatile int z;
//-----------------------------------------------------------
int main(void)
{
    sw->d = 12;
    z = sw->d;
}

 

делается на stm32f417zgt

эксешнен не генерится, такое ощущение что просто команды игнорируются.

чего я не правильно понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

эксешнен не генерится, такое ощущение что просто команды игнорируются.

А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP.

1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом.

2. запись в область флеша здесь не выполняется, во первых флеш начинается со смешением 0x800000, во вторых в нее нелзя писать иначе это называлосьбы озу , можно только попросит флеш контроллер это сделать, это и назывется IAP.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. запись в область флеша здесь не выполняется, во первых флеш начинается со смешением 0x800000, во вторых в нее нелзя писать иначе это называлосьбы озу , можно только попросит флеш контроллер это сделать, это и назывется IAP.

Спасибо, кэп!

Советую почитать тут:

STM32F40xxx and STM32F41xxx Flash programming manual

конкретно вот этот кусок:

The Flash memory programming sequence is as follows:

1. Check that no main Flash memory operation is ongoing by checking the BSY bit in the FLASH_SR register.

2. Set the PG bit in the FLASH_CR register

3. Perform the data write operation(s) to the desired memory address (inside main memory block or OTP area):

– Byte access in case of x8 parallelism

– Half-word access in case of x16 parallelism

– Word access in case of x32 parallelism

– Double word access in case of x64 parallelism

4. Wait for the BSY bit to be cleared

Вот что я имел в виду, когда говорил, что запись в область флэш используется в процесса IAP.

Кстати, если я правильно помню, я проверял процедуру программирования флэш без использования смещения 0x08000000 (то есть с нулевым базовым адресом) и она таки работает.

В свете сказанного выше совсем не удивительно, что никакого эксепшена не происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом.

Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4.

это уже буквоедство. конечно 0 + sizeof(uint32_t) = 4, это сути не меняет.

я чето не понимаю, видимо того что понимают все...

адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть

адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.

Вот никак не пойму, на каком основании сделан этот вывод. "Какие ваши доказательства?"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть

адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.

Насколько я понимаю у вас Cortex-M4? С ним дела не имел, но например в M3, многие исключения могут разрешаться/запрещаться через System control block. Возможно у вас генерация данного исключения просто выключена.

Может в M4 есть что-то типа memory manager-a и его можно использовать для этого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понимаю у вас Cortex-M4?

Что интересно, STM32F4 очень похож на STM32F2. Мне даже кажется, что код для STM32F2 без изменений запустится на STM32F4 (включая конфигурацию PLL и т.д.) Cortex-M4 проявляется только в том, что там есть дополнительные инструкции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...