|
Странная проблема при оптимизации |
|
|
|
Sep 28 2018, 09:29
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Есть такой код Код uint32_t master_ack; //global master_ack = CAN_RX_Master(); if (master_ack == 1) { //пришел сюда если optimization = Low } else //no response { //пришел сюда если optimization = High } master_ack равен 1. при optimization = High я попадаю в else. при optimization = Low я попадаю в if. Все? Сливаем IAR?
Сообщение отредактировал Jenya7 - Sep 28 2018, 09:31
|
|
|
|
|
Sep 28 2018, 09:55
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(scifi @ Sep 28 2018, 15:50) Грабли обычно одни и те же: volatile и гонки.
Есть и другие варианты. 1) Найти косяк в своём коде. 2) Не включать оптимизацию. volatile? а с чего он оптимизирует обычную глобальную переменную? Не включать оптимизацию? оптимизация - это единственное наиболее сильное преимущество IAR. Без оптимизации и в Атолике можно кропать. определил как volatile - то же самое - заходит в else.
Сообщение отредактировал Jenya7 - Sep 28 2018, 10:00
|
|
|
|
|
Sep 28 2018, 10:42
|
Местный
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140
|
Цитата(Jenya7 @ Sep 28 2018, 13:40) объявить их volatile? А когда-то можно было не объявлять?
|
|
|
|
|
Sep 28 2018, 10:50
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 31-01-10
Из: Арзамас
Пользователь №: 55 175
|
Либо mot_num становится отрицательным из-за (RxMessage.ExtId & 0xFF) < BASE_MOTOR_ID, либо opcode не соответствует перечню команд в switch. Копайте в этом направлении.
|
|
|
|
|
Sep 28 2018, 11:12
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(E.V.G. @ Sep 28 2018, 16:50) Либо mot_num становится отрицательным из-за (RxMessage.ExtId & 0xFF) < BASE_MOTOR_ID, либо opcode не соответствует перечню команд в switch. Копайте в этом направлении. так в любом случае return ack; ack - oн всегда будет определен. Цитата(Сергей Борщ @ Sep 28 2018, 17:04) Теперь покажите объявление can_params. Ее член message_received меняется в прерываниии? я заменил флаг can_params.message_received на volatile uint32_t can_message_received; и он устанавливается в прерывании Код void USB_LP_CAN1_RX0_IRQHandler(void) { can_params.fifo_num = CAN_FIFO0; can_message_received = 1; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); } ради эксперемента сделал /*master_ack = */ CAN_RX_Master(); и в начале функции опроса жестко поставил master_ack = 1; - все равно заходит в else. О! Только после того как определил static volatile uint32_t master_ack; - все стало на свои места. отдельно static или отдельно volatile не работает.
Сообщение отредактировал Jenya7 - Sep 28 2018, 11:43
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|