klen 1 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба вот код typedef struct { int z; int d; } EE; EE* sw; volatile int z; //----------------------------------------------------------- int main(void) { sw->d = 12; z = sw->d; } делается на stm32f417zgt эксешнен не генерится, такое ощущение что просто команды игнорируются. чего я не правильно понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shmur 0 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба А с чего вы взяли, что адрес нулевой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба эксешнен не генерится, такое ощущение что просто команды игнорируются. А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP. 1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом. 2. запись в область флеша здесь не выполняется, во первых флеш начинается со смешением 0x800000, во вторых в нее нелзя писать иначе это называлосьбы озу , можно только попросит флеш контроллер это сделать, это и назывется IAP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба 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 (то есть с нулевым базовым адресом) и она таки работает. В свете сказанного выше совсем не удивительно, что никакого эксепшена не происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба 1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом. Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 15 марта, 2012 Опубликовано 15 марта, 2012 · Жалоба Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4. это уже буквоедство. конечно 0 + sizeof(uint32_t) = 4, это сути не меняет. я чето не понимаю, видимо того что понимают все... адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 марта, 2012 Опубликовано 15 марта, 2012 · Жалоба декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя. Вот никак не пойму, на каком основании сделан этот вывод. "Какие ваши доказательства?" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 15 марта, 2012 Опубликовано 15 марта, 2012 · Жалоба адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя. Насколько я понимаю у вас Cortex-M4? С ним дела не имел, но например в M3, многие исключения могут разрешаться/запрещаться через System control block. Возможно у вас генерация данного исключения просто выключена. Может в M4 есть что-то типа memory manager-a и его можно использовать для этого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 марта, 2012 Опубликовано 15 марта, 2012 · Жалоба Насколько я понимаю у вас Cortex-M4? Что интересно, STM32F4 очень похож на STM32F2. Мне даже кажется, что код для STM32F2 без изменений запустится на STM32F4 (включая конфигурацию PLL и т.д.) Cortex-M4 проявляется только в том, что там есть дополнительные инструкции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться