Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обращение по нулевому адресу...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
klen
вот код
Код
typedef struct
{
    int z;
    int d;
} EE;
EE* sw;
volatile int z;
//-----------------------------------------------------------
int main(void)
{
    sw->d = 12;
    z = sw->d;
}


делается на stm32f417zgt
эксешнен не генерится, такое ощущение что просто команды игнорируются.
чего я не правильно понимаю?
shmur
А с чего вы взяли, что адрес нулевой?
scifi
Цитата(klen @ Mar 14 2012, 14:34) *
эксешнен не генерится, такое ощущение что просто команды игнорируются.

А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP.
klen
Цитата(scifi @ Mar 14 2012, 14:50) *
А где написано, что должен быть эксепшн? По мне так наоборот: запись в область флэш используется в процессе IAP.

1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом.
2. запись в область флеша здесь не выполняется, во первых флеш начинается со смешением 0x800000, во вторых в нее нелзя писать иначе это называлосьбы озу , можно только попросит флеш контроллер это сделать, это и назывется IAP.

scifi
Цитата(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 (то есть с нулевым базовым адресом) и она таки работает.
В свете сказанного выше совсем не удивительно, что никакого эксепшена не происходит.
jcxz
Цитата(klen @ Mar 14 2012, 19:57) *
1. адрес нулевой, потому что переменная неинициализирована, значит отправляется линкером в секциюю bss, кусок памяти для секции bss в crt коде забиваются нулями - это поведение определенноне ANSI C стандартом.

Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4.
klen
Цитата(jcxz @ Mar 14 2012, 19:28) *
Даже если принять это, где у вас запись в нулевой адрес? Скорее в адрес == 4.

это уже буквоедство. конечно 0 + sizeof(uint32_t) = 4, это сути не меняет.
я чето не понимаю, видимо того что понимают все...
адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть
адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.
scifi
Цитата(klen @ Mar 15 2012, 11:30) *
декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.

Вот никак не пойму, на каком основании сделан этот вывод. "Какие ваши доказательства?"
jcxz
Цитата(klen @ Mar 15 2012, 13:30) *
адреса 0x00000000...... согласно выставленым пинам BOOT является алиасоми лоя адресов 0x08000000 - тоесть
адреса ячеек флеш накопитяля. если делаю STR r0 , [r1] , где r1 содержит в указанном выше диапазоне то это соответствует попытке записать слово в ячейку по указанному адресу, декодер адреса контроллера шины должен на это отреагировать как недопустимый адрес для операции записи - ведь туда ничего записать принципиально нельзя.

Насколько я понимаю у вас Cortex-M4? С ним дела не имел, но например в M3, многие исключения могут разрешаться/запрещаться через System control block. Возможно у вас генерация данного исключения просто выключена.
Может в M4 есть что-то типа memory manager-a и его можно использовать для этого?
scifi
Цитата(jcxz @ Mar 15 2012, 18:47) *
Насколько я понимаю у вас Cortex-M4?

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