ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
806606 Топик полностью
michas (04.01.2018 18:00, просмотров: 154) ответил 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 }