michas (04.01.2018 18:00, просмотров: 177) ответил a3r3 на Не в какие попало, а в какие положено по стандарту AAPCS. А в чем тайный смысл ручного распределения регистров?
Посмотрел, по этому стандарту, указал регистры по нему, один фиг компилятор раскидал переменные как попало. Ладно, не стал прямо назначать регистры: register volatile uint32_t result_T1;
register volatile uint32_t result_T0;
register volatile uint32_t result_TRAA;
register volatile uint32_t result_TR55;
И один черт, складывает результат теста не в регистр а в озу на этом этапе (result_xx = count_err;). Ну и естественно портит следующий тест.
#define STRT_ADDR_RAM (0x20000000)
#define SIZE_RAM (0x4000)
void RamTest(void)
{
register uint32_t addres_ram;
register uint32_t count_err;
register volatile uint32_t result_T1;
register volatile uint32_t result_T0;
register volatile uint32_t result_TRAA;
register volatile uint32_t result_TR55;
#pragma push
#pragma O0
#pragma Otime
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
*(__IO uint8_t*)addres_ram = 0x00;
}
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
if ((*(__IO uint8_t*)addres_ram) != 0x00){
count_err++;
}
}
result_T0 = count_err;
count_err = 0;
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
*(__IO uint8_t*)addres_ram = 0xFF;
}
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
if ((*(__IO uint8_t*)addres_ram) != 0xFF){
count_err++;
}
}
result_T1 = count_err;
count_err = 0;
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
*(__IO uint8_t*)addres_ram = 0x55;
}
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
if ((*(__IO uint8_t*)addres_ram) != 0x56){
count_err++;
}
}
result_TR55 = count_err;
count_err = 0;
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
*(__IO uint8_t*)addres_ram = 0xAA;
}
for (addres_ram = STRT_ADDR_RAM; addres_ram < STRT_ADDR_RAM + SIZE_RAM; addres_ram++)
{
if ((*(__IO uint8_t*)addres_ram) != 0xAA){
count_err++;
}
}
result_TRAA = count_err;
count_err = 0;
#pragma pop
}