Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Куда в Hi-Tech PICC деваются 4 байта ОЗУ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
kt368
При компиляции простенького проекта (MPLAB IDE, HI-TECH PICC) во вкладке "Build" окна "Output" была получена следующая таблица:
Memory Summary:
Program space used 3Fh ( 63) of 100h words ( 24.6%)
Data space used 7h ( 7) of 10h bytes ( 43.8%)
EEPROM space None available
Configuration bits used 1h ( 1) of 1h word (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
А по дизассемблерному листингу видно, что программа использует только 3 байта ОЗУ (находящиеся по адрессам 0x10, 0x11, 0x12):
Код
---  Z:\Documents\Atola\Projects\Functional blocks\MB_Start\with PIC10F200\FW\src\main.c  --------
1:                 #include <htc.h>
2:                 #define _XTAL_FREQ 4000000
3:                 #define PWR_BTN_ON TRIS=0b1101;
4:                 #define PWR_BTN_OFF TRIS=0b1111;
5:                 __CONFIG (OSC_IntRC  & WDT_OFF  & CP_OFF  & MCLRE_OFF);
6:                 void main(void)
7:                 {
8:                     FOSC4=0;
    06     405     BCF 0x5, 0
9:                     TRIS=0b1111;
    05     C0F     MOVLW 0xf
    07     006     TRIS 0x6
10:                    GP1=0;
    09     426     BCF 0x6, 0x1
11:                    __delay_ms(50);
    08     C41     MOVLW 0x41
    0A     031     MOVWF 0x11
    0B     CEE     MOVLW 0xee
    0C     030     MOVWF 0x10
    0D     2F0     DECFSZ 0x10, F
    0E     A0D     GOTO 0xd
    0F     2F1     DECFSZ 0x11, F
    10     A0D     GOTO 0xd
    11     004     CLRWDT
12:                    while (1)
13:                    {
14:                        if(GP0==0)
    12     606     BTFSC 0x6, 0
    13     A25     GOTO 0x25
15:                        {
16:                            PWR_BTN_ON;
    14     C0D     MOVLW 0xd
    15     006     TRIS 0x6
17:                            __delay_ms(300);
    16     C02     MOVLW 0x2
    17     032     MOVWF 0x12
    18     C86     MOVLW 0x86
    19     031     MOVWF 0x11
    1A     C99     MOVLW 0x99
    1B     030     MOVWF 0x10
    1C     2F0     DECFSZ 0x10, F
    1D     A1C     GOTO 0x1c
    1E     2F1     DECFSZ 0x11, F
    1F     A1C     GOTO 0x1c
    20     2F2     DECFSZ 0x12, F
    21     A1C     GOTO 0x1c
18:                            PWR_BTN_OFF;
    22     C0F     MOVLW 0xf
    23     006     TRIS 0x6
19:                        }
    24     A31     GOTO 0x31
20:                        else __delay_ms(300);
    25     C02     MOVLW 0x2
    26     032     MOVWF 0x12
    27     C86     MOVLW 0x86
    28     031     MOVWF 0x11
    29     C99     MOVLW 0x99
    2A     030     MOVWF 0x10
    2B     2F0     DECFSZ 0x10, F
    2C     A2B     GOTO 0x2b
    2D     2F1     DECFSZ 0x11, F
    2E     A2B     GOTO 0x2b
    2F     2F2     DECFSZ 0x12, F
    30     A2B     GOTO 0x2b
21:                    __delay_ms(300);
    31     C02     MOVLW 0x2
    32     032     MOVWF 0x12
    33     C86     MOVLW 0x86
    34     031     MOVWF 0x11
    35     C99     MOVLW 0x99
    36     030     MOVWF 0x10
    37     2F0     DECFSZ 0x10, F
    38     A37     GOTO 0x37
    39     2F1     DECFSZ 0x11, F
    3A     A37     GOTO 0x37
    3B     2F2     DECFSZ 0x12, F
    3C     A37     GOTO 0x37
    3D     A12     GOTO 0x12
22:                    }
23:                }
    3E     FFF     XORLW 0xff

Вопрос: куда компилятор использует ещё 7-3=4 байта оперативы?
XVR
Включите генерацию подробного map файла в HT-PICC, там будет все написано (кто и куда)
kt368
Включил, в окне "Output" увидел в таблице "Psect Usage Map" следующие строки:
Код
Psect           | Contents                                  | Memory Range    | Size
cstackBANK      | Stack in bank 0                           | 0010h - 0012h   |  3 bytes  
abs_s1          | Absolute RAM variables                    | 001Ch - 001Fh   |  4 bytes

Т.е. эти 4 байта носят название abs_s1. Я так понял это ОЗУ под переменные, адрес которых я указал при помощи символа @ (абсолютные переменные) ? Но ведь в моей программе не было использовано абсолютных переменных.
Откуда тогда появился этот сектор? Как его убрать?
XVR
Цитата(kt368 @ Nov 8 2011, 11:01) *
Откуда тогда появился этот сектор?
Появился скорее всего из за настроек линкера. Поищите галочку, как можно получить более подробный map (возможно это будет называться crossref или нечто подобное). Там должно быть написано под какие именно переменные что было выделено

xemul
Цитата(kt368 @ Nov 8 2011, 11:01) *
Т.е. эти 4 байта носят название abs_s1. Я так понял это ОЗУ под переменные, адрес которых я указал при помощи символа @ (абсолютные переменные) ?

Нет, это ОЗУ под нужды кодогенератора.
Цитата
Откуда тогда появился этот сектор?

Всеведущий кодогенератор резервирует место под xxxtemp независимо от реальной потребности в этих xxxtemp.
Опциями компилятора/линкера не лечится.
Цитата
Как его убрать?

ПисАть на асме.
Надеяться, что кодогенератор станет ещё более всеведущим (имхо, таки вряд ли будут биться за экономию 4 байт в самых мелких и не очень массовых контроллерах).
Использовать другой компилятор.
kt368
Только что попробовал запихнуть по адресу 00x1C мою переменную, всё компилируется и работает. Т.е. то, что компилятор говорит, что используется 7 байт ОЗУ - неправда.
Но да, согласен что это очень малый объём (4 байта), просто хотелось узнать истину.
XVR
В настройках проекта укажите 'Keep generated files' (если он у вас есть), и посмотрите в файл startup.as (или что там появится). Там и будут ваши 4 байта
kt368
В настройках как Вы и говорите указал "Keep generated startup.as". Перекомпилировал. Вот что получилось в файле startup.as:
Код
; HI-TECH C Compiler for PIC10/12/16 MCUs V9.82
; Copyright (C) 1984-2011 HI-TECH Software
;Serial no. HCPICP-111111

; Auto-generated runtime startup code for final link stage.

;
; Compiler options:
;
; -oproj2.cof -mproj2.map --summary=default,+psect,-class,+mem,-hex \
; --output=default,-inhx032 main.p1 --chip=10F200 -P \
; --runtime=default,+clear,+init,+keep,+osccal,-download,-resetbits,-stackcall,+clib \
; --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 \
; --rom=default --ram=default --addrqual=ignore -g --asmlist \
; --errformat=Error   [%n] %f; %l.%c %s --msgformat=Advisory[%n] %s \
; --warnformat=Warning [%n] %f; %l.%c %s
;


    processor    10F200

    global    _main,start,_exit,reset_vec
    fnroot    _main
    psect    config,class=CONFIG,delta=2
    psect    idloc,class=IDLOC,delta=2
    psect    code,class=CODE,delta=2
    psect    powerup,class=CODE,delta=2
    psect    reset_vec,class=CODE,delta=2
    psect    maintext,class=CODE,delta=2
    C    set    0
    Z    set    2
    PCL    set    2
    INDF    set    0

    STATUS    equ    3
    FSR    equ    4
OSCCAL    equ    0x5

    psect    reset_wrap,class=ENTRY,delta=2
    psect    text,class=CODE,delta=2
    psect    functab,class=ENTRY,delta=2
    psect    init,class=ENTRY,delta=2
    psect    cinit,class=ENTRY,delta=2
    psect    end_init,class=ENTRY,delta=2
    psect    clrtext,class=ENTRY,delta=2
    psect    jmp_tab,class=ENTRY,delta=2
    psect    strings,class=STRING,delta=2

    psect    reset_vec,class=CODE,delta=2
reset_vec:
    ds 1;oscillator constant would be pre-programmed here
    psect    reset_wrap
reset_wrap:
    movwf    5    ;calibrate oscillator
    clrf FSR
; No powerup routine


    psect    init
start
_exit
    psect    end_init
    global start_initialization
    ljmp start_initialization;jump to C runtime clear & initialization

psect bank0,class=BANK0,space=1
psect ram,class=RAM,space=1
psect abs1,class=ABS1,space=1
psect common,class=COMMON,space=1
psect sfr0,class=SFR0,space=1


    end    start
Вот файл proj2.as:
Код
opt subtitle "HI-TECH Software Omniscient Code Generator (PRO mode) build 9453"

opt pagewidth 120

    opt pm

    processor    10F200
clrc    macro
    bcf    3,0
    endm
clrz    macro
    bcf    3,2
    endm
setc    macro
    bsf    3,0
    endm
setz    macro
    bsf    3,2
    endm
skipc    macro
    btfss    3,0
    endm
skipz    macro
    btfss    3,2
    endm
skipnc    macro
    btfsc    3,0
    endm
skipnz    macro
    btfsc    3,2
    endm
indf    equ    0
indf0    equ    0
pc    equ    2
pcl    equ    2
status    equ    3
fsr    equ    4
fsr0    equ    4
c    equ    1
z    equ    0
# 5 "Z:\Documents\Atola\Projects\Functional blocks\MB_Start\with PIC10F200\FW\src\main.c"
    psect config,class=CONFIG,delta=2;#
# 5 "Z:\Documents\Atola\Projects\Functional blocks\MB_Start\with PIC10F200\FW\src\main.c"
    dw 0xFFFF & 0xFFFB & 0xFFFF & 0xFFEF;#
    FNROOT    _main
    global    _TRIS
psect    maintext,global,class=CODE,delta=2
global __pmaintext
__pmaintext:
_TRIS    set    6
    global    _FOSC4
_FOSC4    set    40
    global    _GP0
_GP0    set    48
    global    _GP1
_GP1    set    49
    file    "proj2.as"
    line    #
psect cinit,class=ENTRY,delta=2
global start_initialization
start_initialization:

psect cinit,class=ENTRY,delta=2
global end_of_initialization

;End of C runtime variable initialization code

end_of_initialization:
clrf fsr
ljmp _main;jump to C main() function
psect    cstackBANK0,class=BANK0,space=1
global __pcstackBANK0
__pcstackBANK0:
    global    ?_main
?_main:; 0 bytes @ 0x0
    global    ??_main
??_main:; 0 bytes @ 0x0
    ds    3
;;Data sizes: Strings 0, constant 0, data 0, bss 0, persistent 0 stack 0
;;Auto spaces:   Size  Autos    Used
;; COMMON           0      0       0
;; BANK0           14      3       3

;;
;; Pointer list with targets:



;;
;; Critical Paths under _main in COMMON
;;
;;   None.
;;
;; Critical Paths under _main in BANK0
;;
;;   None.

;;
;;Main: autosize = 0, tempsize = 3, incstack = 0, save=0
;;

;;
;;Call Graph Tables:
;;
;; ---------------------------------------------------------------------------------
;; (Depth) Function               Calls       Base Space   Used Autos Params    Refs
;; ---------------------------------------------------------------------------------
;; (0) _main                                                 3     3      0       0
;;                                              0 BANK0      3     3      0
;; ---------------------------------------------------------------------------------
;; Estimated maximum stack depth 0
;; ---------------------------------------------------------------------------------

;; Call Graph Graphs:

;; _main (ROOT)
;;

;; Address spaces:

;;Name               Size   Autos  Total    Cost      Usage
;;STACK                0      0       0       0        0.0%
;;NULL                 0      0       0       0        0.0%
;;CODE                 0      0       0       0        0.0%
;;BITSFR0              0      0       0       1        0.0%
;;SFR0                 0      0       0       1        0.0%
;;DATA                 0      0       0       1        0.0%
;;BITCOMMON            0      0       0       2        0.0%
;;BITBANK0             E      0       0       3        0.0%
;;COMMON               0      0       0       4        0.0%
;;BANK0                E      3       3       5       21.4%
;;ABS                  0      0       0       6        0.0%

    global    _main
psect    maintext

;; *************** function _main *****************
;; Defined at:
;;        line 7 in file "Z:\Documents\Atola\Projects\Functional blocks\MB_Start\with PIC10F200\FW\src\main.c"
;; Parameters:    Size  Location     Type
;;        None
;; Auto vars:     Size  Location     Type
;;        None
;; Return value:  Size  Location     Type
;;        None               void
;; Registers used:
;;        wreg, fsr0l, fsr0h
;; Tracked objects:
;;        On entry : 17F/0
;;        On exit  : 0/0
;;        Unchanged: 0/0
;; Data sizes:     COMMON   BANK0
;;      Params:         0       0
;;      Locals:         0       0
;;      Temps:          0       3
;;      Totals:         0       3
;;Total ram usage:        3 bytes
;; This function calls:
;;        Nothing
;; This function is called by:
;;        Startup code after reset
;; This function uses a non-reentrant model
;;
psect    maintext
    file    "Z:\Documents\Atola\Projects\Functional blocks\MB_Start\with PIC10F200\FW\src\main.c"
    line    7
    global    __size_of_main
    __size_of_main    equ    __end_of_main-_main
    
_main:    
    opt    stack 2
; Regs used in _main: [wregfsr0]
    line    8
    
l457:    
;main.c: 8: FOSC4=0;
    bcf    (40/8),(40)&7
    line    9
    
l459:    
;main.c: 9: TRIS=0b1111;
    movlw    (0Fh)
    tris    0x6
    line    10
    
l461:    
;main.c: 10: GP1=0;
    bcf    (49/8),(49)&7
    line    11
    
l463:    
;main.c: 11: _delay((unsigned long)((50)*(4000000/4000.0)));
    opt asmopt_off
movlw    65
movwf    ((??_main+0)+0+1),f
    movlw    238
movwf    ((??_main+0)+0),f
u37:
    decfsz    ((??_main+0)+0),f
    goto    u37
    decfsz    ((??_main+0)+0+1),f
    goto    u37
    clrwdt
opt asmopt_on

    line    12
;main.c: 12: while (1)
    
l67:    
    line    14
;main.c: 13: {
;main.c: 14: if(GP0==0)
    btfsc    (48/8),(48)&7
    goto    u21
    goto    u20
u21:
    goto    l471
u20:
    line    16
    
l465:    
;main.c: 15: {
;main.c: 16: TRIS=0b1101;;
    movlw    (0Dh)
    tris    0x6
    line    17
    
l467:    
;main.c: 17: _delay((unsigned long)((300)*(4000000/4000.0)));
    opt asmopt_off
movlw  2
movwf    ((??_main+0)+0+2),f
movlw    134
movwf    ((??_main+0)+0+1),f
    movlw    153
movwf    ((??_main+0)+0),f
u47:
    decfsz    ((??_main+0)+0),f
    goto    u47
    decfsz    ((??_main+0)+0+1),f
    goto    u47
    decfsz    ((??_main+0)+0+2),f
    goto    u47
opt asmopt_on

    line    18
    
l469:    
;main.c: 18: TRIS=0b1111;;
    movlw    (0Fh)
    tris    0x6
    line    19
;main.c: 19: }
    goto    l69
    line    20
    
l471:    
;main.c: 20: else _delay((unsigned long)((300)*(4000000/4000.0)));
    opt asmopt_off
movlw  2
movwf    ((??_main+0)+0+2),f
movlw    134
movwf    ((??_main+0)+0+1),f
    movlw    153
movwf    ((??_main+0)+0),f
u57:
    decfsz    ((??_main+0)+0),f
    goto    u57
    decfsz    ((??_main+0)+0+1),f
    goto    u57
    decfsz    ((??_main+0)+0+2),f
    goto    u57
opt asmopt_on

    
l69:    
    line    21
;main.c: 21: _delay((unsigned long)((300)*(4000000/4000.0)));
    opt asmopt_off
movlw  2
movwf    ((??_main+0)+0+2),f
movlw    134
movwf    ((??_main+0)+0+1),f
    movlw    153
movwf    ((??_main+0)+0),f
u67:
    decfsz    ((??_main+0)+0),f
    goto    u67
    decfsz    ((??_main+0)+0+1),f
    goto    u67
    decfsz    ((??_main+0)+0+2),f
    goto    u67
opt asmopt_on

    goto    l67
    global    start
    ljmp    start
    opt stack 0
psect    maintext
    line    23
GLOBAL    __end_of_main
    __end_of_main:
;; =============== function _main ends ============

    signat    _main,88
    global    btemp
    btemp set 01Ch

    DABS    1,28,4;btemp
    global    wtemp0
    wtemp0 set btemp
    global    wtemp1
    wtemp1 set btemp+2
    global    wtemp2
    wtemp2 set btemp+4
    global    wtemp3
    wtemp3 set btemp+6
    global    ttemp0
    ttemp0 set btemp
    global    ttemp1
    ttemp1 set btemp+3
    global    ltemp0
    ltemp0 set btemp
    global    ltemp1
    ltemp1 set btemp+4
    end

Понял я из этого файла не много. Вижу что есть btemp (по адресу 0x1C), но также есть и btemp+6 (по идее это 0x1C+6=0x22). Но как так может быть, если в выбранном МК максимальные адрес ОЗУ - 0x1F. Подскажите кто чем может =) ...
XVR
Цитата
Вижу что есть btemp (по адресу 0x1C),
Вот это они и есть. Это внутренние переменные кодогенератора. Не уверен, что это можно отключить sad.gif
Цитата
но также есть и btemp+6
Похоже он никогда не используется
Allregia
Цитата(xemul @ Nov 8 2011, 16:30) *
(имхо, таки вряд ли будут биться за экономию 4 байт в самых мелких и не очень массовых контроллерах).


Среди "мелких" - эти как раз самые массовые в мире.
А 4 байта уходят на служебные нужды, например на сохранение W и STATUS при прерывании.
xemul
Цитата(Allregia @ Nov 10 2011, 19:20) *
А 4 байта уходят на служебные нужды, например на сохранение W и STATUS при прерывании.

В контроллерах с прерываниями (baseline PIC10 к ним не относятся) писс сохраняет W, STATUS, PCLAT и другие регистры по необходимости в wtemp и выше. Остальным xxxtemp в более разумных контроллерах тоже находится применение, и в 4 байта там точно не вписаться.
Для микробов же типа PIC10F200, где xxxtemp никак не используются, отводить осьмушку ОЗУ в никуда, имхо, странновато.
Об этом я и писал - кодогенератор под baseline не заточен/не оптимален, но вряд ли стоит ожидать, что его допилят хотя бы в этом плане.
ViKo
Цитата(kt368 @ Nov 8 2011, 22:00) *
Понял я из этого файла не много...

Можно еще посмотреть на программу, открыв окошко Program Memory. Там тоже можно увидеть дизассемблерный код. Только что я нашел в своей программе 7 из 8 используемых ячеек ОЗУ. PIC16F887.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.