реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> iar v4.11 - disassembly непонятно работает
Юдин Алексей
сообщение Feb 26 2009, 10:57
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 16-10-06
Пользователь №: 21 358



Доброго времени суток. Проблема в следующем. Дизассемблер по-разному дизассемблирует один и тот же код в программе. Вот пример:

случай первый:
CODE

WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
__low_level_init:
00C3C8 40B2 5A80 0120 mov.w #0x5A80,&WDTCTL

тут все понятно - все верно

случай второй:
CODE

WDTCTL = WDTPW + WDTHOLD;
Flash_ww:
00AB76 403E 5A80 mov.w #0x5A80,R14
00AB7A 4E4F mov.b R14,R15
00AB7C 108E swpb R14
00AB7E F03E 00FF and.w #0xFF,R14
00AB82 4FC2 0120 mov.b R15,&WDTCTL
00AB86 4EC2 0121 mov.b R14,&0x121

а вот здесь не понятно почему так, а не как в 1ом случае. Соответственно здесь меня ресетит (согласно коду в дизассемблере так и должно происходить).

В чем проблема, подскажите?
Go to the top of the page
 
+Quote Post
zhevak
сообщение Feb 26 2009, 11:33
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Юдин Алексей @ Feb 26 2009, 15:57) *
Дизассемблер по-разному дизассемблирует один и тот же код в программе.

Попробую угадать.
1. Вероятно Вы имеете ввиду ассемблер, а не дизассемблер?
2. Ваш исходный текст написан на С или С++.
3. Вы использовали компилятор IAR.

На этом потенциал моих телепатических возможностей иссякает.

Какие опции для компиляции Вы использовали?
Какие уровени оптимизации Вы задавали для каждого случая?
Не пробовали просто, неконкретно по Вашему вопросу, почитать какие-нибудь книжки или
походить по форумам, где обсуждаются как микроконтроллер вообще, так и языки группы С/С++?

Я понимаю, это долго и нудно, но может быть это натолкнет Вас самого на правильный ответ. А то, с
одной стороны, как-то готового ответа для Вас нет (как минимум у меня -- нет), а с другой стороны --
угадывать, что там у Вас за проблема -- как-то тоже несподручно. А потом ею еще заниматься надо,
и все это ради удовлетворения Вашего любопытства.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Юдин Алексей
сообщение Feb 26 2009, 11:45
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 16-10-06
Пользователь №: 21 358



Оптимизация - none для обоих случаев - для всего проекта.

Цитата
Не пробовали просто, неконкретно по Вашему вопросу, почитать какие-нибудь книжки или
походить по форумам, где обсуждаются как микроконтроллер вообще, так и языки группы С/С++?

Можно было сразу так написать
Цитата
как-то готового ответа для Вас нет
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 26 2009, 11:55
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Юдин Алексей @ Feb 26 2009, 12:57) *
В чем проблема, подскажите?
Попробуйте *(volatile unsigned int *)&WDTCTL = WDTPW+WDTHOLD; Если будет тот же эффект - глюк компилятора. Это самая свежая версия?
И еще - не надо отключайть оптимизацию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Юдин Алексей
сообщение Feb 26 2009, 12:12
Сообщение #5





Группа: Участник
Сообщений: 8
Регистрация: 16-10-06
Пользователь №: 21 358



ну по умолчанию оптимизация стояла low. С ней уже много у меня косяков было, поэтому и поставил none. Версия 4.11b - не самая свежая. Вроде 4.20 - последняя. А про оптимизацию все по-разному советуют, почему отключать не надо?

Цитата
Попробуйте *(volatile unsigned int *)&WDTCTL = WDTPW+WDTHOLD;


Спасибо, помогло. А что ж IARу так не нравилось?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 26 2009, 12:25
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Юдин Алексей @ Feb 26 2009, 14:12) *
ну по умолчанию оптимизация стояла low. С ней уже много у меня косяков было, поэтому и поставил none.
То есть вместо того, чтобы устранять "косяки" вы их загнали поглубже. Правильно написанная программа работает при любой оптимизации. Точнее, может иногда не работать при низких уровнях оптимизации потому что просто не будет успевать.
Цитата(Юдин Алексей @ Feb 26 2009, 14:12) *
А про оптимизацию все по-разному советуют, почему отключать не надо?
А зачем ее отключать? Зачем заставлять процессор выполнять ненужные действия, если можно попросить компилятор сделать лучше? Отключать какие-то конкретные проходы оптимизации можно, если они генерят ошибочный код, но это бывает настолько редко и как правило на самых высоких уровнях оптимизации. Уж на low-то ошибок не должно быть точно. Я использовал максимальную оптимизацию по скорости.
Цитата(Юдин Алексей @ Feb 26 2009, 14:12) *
Спасибо, помогло. А что ж IARу так не нравилось?
Пока трудно сказать. Надо смотреть, как описан WDTCTL в заголовочных файлах. Для этого можно попросить компилятор сохранить вывод препроцессора в файл.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Юдин Алексей
сообщение Feb 26 2009, 12:49
Сообщение #7





Группа: Участник
Сообщений: 8
Регистрация: 16-10-06
Пользователь №: 21 358



CODE
__no_init volatile union
{
unsigned short WDTCTL; /* Watchdog Timer Control */

struct
{
unsigned short WDTIS0 : 1;
unsigned short WDTIS1 : 1;
unsigned short WDTSSEL : 1;
unsigned short WDTCNTCL : 1;
unsigned short WDTTMSEL : 1;
unsigned short WDTNMI : 1;
unsigned short WDTNMIES : 1;
unsigned short WDTHOLD : 1;
unsigned short : 8;
} WDTCTL_bit;
} @ 0x0120;


Описание в хедере. 16бит регистр, а вместо того, чтобы грузит в него сразу 16 бит, он их бьет на две части. Сначала грузит мл. часть по 0x0120, затем старшую 0x0121. Ну а записав младшую без старшей watchdog сразу сбрасывается.
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 26 2009, 12:51
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



УЖОСНАХ...
где только такое откопали...
CODE

#define WDTCTL_ 0x0120 /* Watchdog Timer Control */
sfrw (WDTCTL,WDTCTL_);
/* The bit names have been prefixed with "WDT" */
#define WDTIS0 0x0001
#define WDTIS1 0x0002
#define WDTSSEL 0x0004
#define WDTCNTCL 0x0008
#define WDTTMSEL 0x0010
#define WDTNMI 0x0020
#define WDTNMIES 0x0040
#define WDTHOLD 0x0080

#define WDTPW 0x5A00

/* WDT-interval times [1ms] coded with Bits 0-2 */
/* WDT is clocked by fMCLK (assumed 1MHz) */
#define WDT_MDLY_32 (WDTPW|WDTTMSEL|WDTCNTCL) /* 32ms interval (default) */
#define WDT_MDLY_8 (WDTPW|WDTTMSEL|WDTCNTCL|WDTIS0) /* 8ms " */
#define WDT_MDLY_0_5 (WDTPW|WDTTMSEL|WDTCNTCL|WDTIS1) /* 0.5ms " */
#define WDT_MDLY_0_064 (WDTPW|WDTTMSEL|WDTCNTCL|WDTIS1|WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ADLY_1000 (WDTPW|WDTTMSEL|WDTCNTCL|WDTSSEL) /* 1000ms " */
#define WDT_ADLY_250 (WDTPW|WDTTMSEL|WDTCNTCL|WDTSSEL|WDTIS0) /* 250ms " */
#define WDT_ADLY_16 (WDTPW|WDTTMSEL|WDTCNTCL|WDTSSEL|WDTIS1) /* 16ms " */
#define WDT_ADLY_1_9 (WDTPW|WDTTMSEL|WDTCNTCL|WDTSSEL|WDTIS1|WDTIS0) /* 1.9ms " */
/* Watchdog mode -> reset after expired time */
/* WDT is clocked by fMCLK (assumed 1MHz) */
#define WDT_MRST_32 (WDTPW|WDTCNTCL) /* 32ms interval (default) */
#define WDT_MRST_8 (WDTPW|WDTCNTCL|WDTIS0) /* 8ms " */
#define WDT_MRST_0_5 (WDTPW|WDTCNTCL|WDTIS1) /* 0.5ms " */
#define WDT_MRST_0_064 (WDTPW|WDTCNTCL|WDTIS1|WDTIS0) /* 0.064ms " */
/* WDT is clocked by fACLK (assumed 32KHz) */
#define WDT_ARST_1000 (WDTPW|WDTCNTCL|WDTSSEL) /* 1000ms " */
#define WDT_ARST_250 (WDTPW|WDTCNTCL|WDTSSEL|WDTIS0) /* 250ms " */
#define WDT_ARST_16 (WDTPW|WDTCNTCL|WDTSSEL|WDTIS1) /* 16ms " */
#define WDT_ARST_1_9 (WDTPW|WDTCNTCL|WDTSSEL|WDTIS1|WDTIS0) /* 1.9ms " */

/* INTERRUPT CONTROL */
/* These two bits are defined in the Special Function Registers */
/* #define WDTIE 0x01 */
/* #define WDTIFG 0x01 */

Дарю...
* © 2002 by M. P. Ashton <data@ieee.org>
* Originally based in part on work by Texas Instruments Inc.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Юдин Алексей
сообщение Feb 26 2009, 13:01
Сообщение #9





Группа: Участник
Сообщений: 8
Регистрация: 16-10-06
Пользователь №: 21 358



А вот такое вот дело выходит с максимальной оптимизацией по скорости:
Код
  WDTCTL = WDTPW + WDTHOLD;
Flash_clr:
002ACC   40F2 0080 0120    mov.b   #0x80,&WDTCTL
002AD2   40F2 005A 0121    mov.b   #0x5A,&0x121
Go to the top of the page
 
+Quote Post
_3m
сообщение Feb 26 2009, 16:14
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(MrYuran @ Feb 26 2009, 15:51) *
УЖОСНАХ...
где только такое откопали...

В любом файле io430xxxxx.h
Действительно УЖОС!
Я давно отказался от использования io430 и применяю только msp403xxxxx.h
Че-то они перемудрили в иаре.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.04874 секунд с 7
ELECTRONIX ©2004-2016