простой код:
Код
int main (void)
{
int rrr[4]={1,2,3,4};
rrr[0] = IO0PIN;
IO0SET = rrr[0]+rrr[1];
while(rrr[1] != 0x0000FFFF) rrr[1]++;
return 0;
}
{
int rrr[4]={1,2,3,4};
rrr[0] = IO0PIN;
IO0SET = rrr[0]+rrr[1];
while(rrr[1] != 0x0000FFFF) rrr[1]++;
return 0;
}
Код не делает ничего полезного, просо обьявляет массив и немного с ним работает, чтобы оптимизатор обьявление не удалил.
В режиме отладки наблюдается странность. Я в Watch слежу за rrr. При входе в main оно имеет значение 0x40000450. След. шаг, на строке
int rrr[4]={1,2,3,4}; rrr=0x40000430
При этом в окне Watch развернув массив я не вижу его начальной инициализации. Там не 1,2,3,4 а что-то совсем не понятное. Вторая строка кода rrr[0] = IO0PIN; меняет первый элемент массива, но по адресу 0x400000450, и следовательно в Watch этого не показывает т.к. он смотрит за массивом по адресу 0x40000430.
Далее я переслючаюсь на CARM и проверяю тоже самое после компиляции в нем. В этом случае работает все понятно. Массив сразу проинициализирован. Его адрес в Watch не меняется и все изменения сразу отображаются.
Вот хочу спросить, что это за особенность такая и как с ней бороться.
В более сложных проектах, это вылилось в то, что обьявив массив
BYTE cvr[4];
Я получаю cvr = 0x3FFFFF8E, и симулятор uVision пишет, что позиция 0x3FFFFF8E не доступна для записи.