|
|
  |
обращение по нулевому адресу..., ексепшен не генерится |
|
|
|
Mar 14 2012, 10:34
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
вот код Код typedef struct { int z; int d; } EE; EE* sw; volatile int z; //----------------------------------------------------------- int main(void) { sw->d = 12; z = sw->d; } делается на stm32f417zgt эксешнен не генерится, такое ощущение что просто команды игнорируются. чего я не правильно понимаю?
|
|
|
|
|
Mar 14 2012, 10:40
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553

|
А с чего вы взяли, что адрес нулевой?
|
|
|
|
|
Mar 14 2012, 13:57
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(scifi @ Mar 14 2012, 14:50)  А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP. 1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом. 2. запись в область флеша здесь не выполняется, во первых флеш начинается со смешением 0x800000, во вторых в нее нелзя писать иначе это называлосьбы озу , можно только попросит флеш контроллер это сделать, это и назывется IAP.
|
|
|
|
|
Mar 14 2012, 14:18
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(klen @ Mar 14 2012, 17:57)  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 (то есть с нулевым базовым адресом) и она таки работает. В свете сказанного выше совсем не удивительно, что никакого эксепшена не происходит.
|
|
|
|
|
Mar 15 2012, 07:30
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(jcxz @ Mar 14 2012, 19:28)  Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4. это уже буквоедство. конечно 0 + sizeof(uint32_t) = 4, это сути не меняет. я чето не понимаю, видимо того что понимают все... адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|