ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
26 августа
489657 Топик полностью
Vladimir Ljaschko (20.02.2014 10:51, просмотров: 200) ответил SciFi на Вы дизассемблер сверху обрезали, а там тоже интересно. Ну и RST_SR всё время загружается, как будто у него в объявлении отсутствует volatile. Объявления флагов RST_SR_EMCF и проч. тоже интересны. Кстати, а почему переменная dat глобальная?
Нет такого наследия, переменную я уже потом вынес, думал не будет оптимизироваться. Ан нет. Я знаю, что static правильнее, но больше кликов. Это со статиком, сейчас вообще мешанина, непонятно зачем он еще много раз читает регистр.  Все объявления стандартные от ИАР, volatile присутствует. /*--------------------------------------------- * Define NAME as an I/O reg with bit accesss * Access of 8 bit reg: NAME * Access of bit(s): NAME_bit.noXX *--------------------------------------------*/ #define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT) \ __near __no_init volatile ATTRIBUTE union \ { \ unsigned char NAME; \ BIT_STRUCT NAME ## _bit; \ } @ ADDRESS; /*------------------------------------------------------------------------- * RST register definitions *-----------------------------------------------------------------------*/ /* Reset status register */ #ifdef __IAR_SYSTEMS_ICC__ typedef struct { unsigned char WWDGF : 1; unsigned char IWDGF : 1; unsigned char ILLOPF : 1; unsigned char SWIMF : 1; unsigned char EMCF : 1; } __BITS_RST_SR; #endif __IO_REG8_BIT(RST_SR, 0x50B3, __READ_WRITE, __BITS_RST_SR); #define RST_SR_EMCF ((uint8_t)0x10) /*!< EMC reset flag bit mask */ #define RST_SR_SWIMF ((uint8_t)0x08) /*!< SWIM reset flag bit mask */ #define RST_SR_ILLOPF ((uint8_t)0x04) /*!< Illegal opcode reset flag bit mask */ #define RST_SR_IWDGF ((uint8_t)0x02) /*!< IWDG reset flag bit mask */ #define RST_SR_WWDGF ((uint8_t)0x01) /*!< WWDG reset flag bit mask */
    00C13B    351F0491       MOV       state, #0x1F
}
??fMemoryControl_2:
    00C13F    CCAD09         JP        ?epilogue_w4
	dat=RST_SR;
CheckReset:
    00C142    C650B3         LD        A, RST_SR
    00C145    C70E12         LD        ??dat, A
	if (dat==0)
    00C148    2615           JRNE      ??CheckReset_0
	{	emc_token=0;
    00C14A    725F0F46       CLR       .iar.dynexit$$Limit
		swim_token=0;
    00C14E    725F0F47       CLR       swim_token
	 	illopf_token=0;
    00C152    725F0F48       CLR       illopf_token
	 	iwdg_token=0;
    00C156    725F0F49       CLR       iwdg_token
	 	wwdg_token=0;
    00C15A    725F0F4A       CLR       wwdg_token
		return;
    00C15E    81             RET
	if (dat&RST_SR_EMCF)	emc_token++;
??CheckReset_0:
    00C15F    C650B3         LD        A, RST_SR
    00C162    72010E120B     BTJF      ??dat, #0, ??CheckReset_1
    00C167    A510           BCP       A, #com3
    00C169    2707           JREQ      ??CheckReset_1
	if (dat&RST_SR_EMCF)	emc_token++;
    00C16B    C60F46         LD        A, .iar.dynexit$$Limit
    00C16E    4C             INC       A
    00C16F    C70F46         LD        .iar.dynexit$$Limit, A
	if (dat&RST_SR_SWIMF)	swim_token++;
??CheckReset_1:
    00C172    C650B3         LD        A, RST_SR
    00C175    72010E120B     BTJF      ??dat, #0, ??CheckReset_2
    00C17A    A508           BCP       A, #?b8
    00C17C    2707           JREQ      ??CheckReset_2
	if (dat&RST_SR_SWIMF)	swim_token++;
    00C17E    C60F47         LD        A, swim_token
    00C181    4C             INC       A
    00C182    C70F47         LD        swim_token, A
	if (dat&RST_SR_ILLOPF)	illopf_token++;
??CheckReset_2:
    00C185    C650B3         LD        A, RST_SR
    00C188    72010E120B     BTJF      ??dat, #0, ??CheckReset_3
    00C18D    A504           BCP       A, #?b4
    00C18F    2707           JREQ      ??CheckReset_3
	if (dat&RST_SR_ILLOPF)	illopf_token++;
    00C191    C60F48         LD        A, illopf_token
    00C194    4C             INC       A
    00C195    C70F48         LD        illopf_token, A
	if (dat& RST_SR_IWDGF) 	iwdg_token++;
??CheckReset_3:
    00C198    C650B3         LD        A, RST_SR
    00C19B    72010E120B     BTJF      ??dat, #0, ??CheckReset_4
    00C1A0    A502           BCP       A, #?b2
    00C1A2    2707           JREQ      ??CheckReset_4
	if (dat& RST_SR_IWDGF) 	iwdg_token++;
    00C1A4    C60F49         LD        A, iwdg_token
    00C1A7    4C             INC       A
    00C1A8    C70F49         LD        iwdg_token, A
	if (dat&RST_SR_WWDGF) 	wwdg_token++;
??CheckReset_4:
    00C1AB    C650B3         LD        A, RST_SR
    00C1AE    A401           AND       A, #?b1
    00C1B0    88             PUSH      A
    00C1B1    C60E12         LD        A, ??dat
    00C1B4    A401           AND       A, #?b1
    00C1B6    B701           LD        ?b1, A
    00C1B8    84             POP       A
    00C1B9    B501           BCP       A, ?b1
    00C1BB    2707           JREQ      ??CheckReset_5
	if (dat&RST_SR_WWDGF) 	wwdg_token++;
    00C1BD    C60F4A         LD        A, wwdg_token
    00C1C0    4C             INC       A
    00C1C1    C70F4A         LD        wwdg_token, A
}
??CheckReset_5:
    00C1C4    81             RET
IMPL_PROLOG(system)
systemSetVar:
    00C1C5    CDAC6F         CALL      ?push_w4
    00C1C8    BF08           LDW       ?b8, X
IMPL_PROLOG(system)
    00C1CA    5C             INCW      X
    00C1CB    F6             LD        A, (X)
    00C1CC    271D           JREQ      ??systemSetVar_0
    00C1CE    4A             DEC       A
    00C1CF    271A           JREQ      ??systemSetVar_0
    00C1D1    4A             DEC       A
    00C1D2    2717           JREQ      ??systemSetVar_0
    00C1D4    4A             DEC       A
    00C1D5    271B           JREQ      ??systemSetVar_1
    00C1D7    4A             DEC       A
    00C1D8    2720           JREQ      ??systemSetVar_2