数码之家

 找回密码
 立即注册
搜索

恭喜您,帖子穿越成功!

您是第4593973位成功穿越者

查看: 1597|回复: 13

[STM] iar for stm8怎么看ram占用,我啥都没写也占用268字节?

[复制链接]
发表于 2022-2-23 10:58:20 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kkstun 于 2022-2-23 11:02 编辑

研究了下ram占用情况,我就写了个空的函数,结果占用这么多?
void main(void)
{
  while(1)
  {}
}




  106 bytes of readonly  code memory

  128 bytes of readonly  data memory

  268 bytes of readwrite data memory


连#include<iostm8s103f3.h> 都没加
有没有大神能够详解。

我看了下完整的信息,main.c是没占ram
main.c  
~~~~~~~~~~~~~~~~~~~~~~~~~~

   IAR C/C++ Compiler V1.31.1.20058 [Evaluation] for STM8
   Copyright 2010-2012 IAR Systems AB.  

2 bytes of CODE memory

Errors: none
Warnings: none

Linking
~~~~~~~~~~~~~~~~

   IAR ELF Linker V1.31.1.50058 for STM8
   Copyright 2010-2012 IAR Systems AB.

  106 bytes of readonly  code memory
  128 bytes of readonly  data memory
  268 bytes of readwrite data memory

Errors: none
Warnings: none


 楼主| 发表于 2022-2-23 11:05:33 | 显示全部楼层
似乎是堆栈的栈大小?
回复 支持 反对

使用道具 举报

发表于 2022-2-23 11:25:24 | 显示全部楼层
底层启动文件占用的,程序运行时会先执行rw段初始化,zi段清零等操作,你看不到的

打赏

参与人数 1家元 +8 收起 理由
家睦 + 8

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-2-23 12:09:17 来自手机浏览器 | 显示全部楼层
在main前后,编译器默默帮你很多,大部分程序员一无所知。
要想0byte,需要上汇编,一切靠自己
回复 支持 反对

使用道具 举报

发表于 2022-2-23 12:34:48 | 显示全部楼层
kaixi_ants 发表于 2022-2-23 12:09
在main前后,编译器默默帮你很多,大部分程序员一无所知。
要想0byte,需要上汇编,一切靠自己 ...

宁愿蹬天,不学汇编。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-23 13:45:00 | 显示全部楼层
本帖最后由 kkstun 于 2022-2-23 13:56 编辑

还有个问题就是我这样也能编译成功?
unsigned char a[2000];

void main(void)
{
  int i=0;
  
  for(;i<2000;i++){
    a=1;
  }
  while(1)
  {

  }
}


我记得keil会报错,是哪里设置不对吗。stm8s103ram只有1k啊
   IAR C/C++ Compiler V1.31.1.20058 [Evaluation] for STM8
   Copyright 2010-2012 IAR Systems AB.  

     2 bytes of CODE memory
2 000 bytes of DATA memory

Errors: none
Warnings: none

应该是这里
Code的small是64K byte寻址范围,medium是16M byte范围,但函数不允许跨越64K byte边界, large模式下是16M byte寻址范围,函数不存在跨界限制,随便放
Date的small是256 byte寻址范围,medium是64K byte范围,large是16M范围。
工程设置里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2022-2-23 13:45:17 | 显示全部楼层
温力口 发表于 2022-2-23 12:34
宁愿蹬天,不学汇编。

学单片机的学点汇编还是有很多好处的。
PS:瞥了一眼你的M币震惊了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-23 13:48:06 | 显示全部楼层
ww5223017240 发表于 2022-2-23 13:45
学单片机的学点汇编还是有很多好处的。
PS:瞥了一眼你的M币震惊了 ...

是的M太多了
回复 支持 反对

使用道具 举报

发表于 2022-2-23 15:48:41 | 显示全部楼层
unsigned char a[2000];只这句就要占不少空间吧
回复 支持 反对

使用道具 举报

发表于 2022-2-25 11:19:30 | 显示全部楼层
应该是没设置芯片型号,所以占用2000也没问题。
占用256是堆栈

打赏

参与人数 1家元 +20 收起 理由
kkstun + 20 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-2-26 22:19:18 | 显示全部楼层
你点开工程里的Output文件夹,里面有个*.map文件,打开它。

==================================================
###############################################################################
#
# IAR ELF Linker V2.20.1.176 for STM8                     26/Feb/2022  22:18:05
# Copyright 2010-2015 IAR Systems AB.
#
#    Output file  =  C:\TMP\IAR\Debug\Exe\111.out
#    Map file     =  C:\TMP\IAR\Debug\List\111.map
#    Command line =  
#        C:\TMP\IAR\Debug\Obj\main.o --redirect _Printf=_PrintfFullNoMb
#        --redirect _Scanf=_ScanfFullNoMb -o C:\TMP\IAR\Debug\Exe\111.out --map
#        C:\TMP\IAR\Debug\List\111.map --config "C:\Program Files (x86)\IAR
#        Systems\Embedded Workbench 7.3\stm8\config\lnkstm8s003f3.icf"
#        --config_def _CSTACK_SIZE=0x100 --config_def _HEAP_SIZE=0x100 --entry
#        __iar_program_start --debug_lib
#
###############################################################################

*******************************************************************************
*** RUNTIME MODEL ATTRIBUTES
***

__SystemLibrary            = DLib
__code_model               = small
__core                     = stm8
__data_model               = small
__dlib_file_descriptor     = 0
__dlib_full_locale_support = 0
__rt_version               = 4


*******************************************************************************
*** PLACEMENT SUMMARY
***

"A1":  place at start of [0x000000-0x0000ff] { rw section .vregs };
"A2":  place at end of [0x000000-0x0003ff] { block CSTACK };
"A3":  place at start of [0x008000-0x009fff] { block INTVEC };
"P3":  place in [from 0x008000 to 0x009fff] {
          ro section __DLIB_PERTHREAD_init, ro section .far.data_init,
          ro section .far_func.textrw_init, ro section .huge.data_init,
          ro section .huge_func.textrw_init, ro section .iar.init_table,
          ro section .init_array, ro section .near.data_init,
          ro section .near.rodata, ro section .near_func.text,
          ro section .near_func.textrw_init, ro section .tiny.data_init,
          ro section .tiny.rodata_init };

  Section          Kind      Address   Size  Object
  -------          ----      -------   ----  ------
"A1":                                   0xc
  .vregs           uninit   0x000000    0xc  vregs.o [4]
                          - 0x00000c    0xc

"A2":                                 0x100
  CSTACK                    0x000300  0x100  <Block>
    CSTACK         uninit   0x000300  0x100  <Block tail>
                          - 0x000400  0x100

"A3":                                  0x80
  INTVEC                    0x008000   0x80  <Block>
    .intvec        const    0x008000   0x80  interrupt.o [4]
                          - 0x008080   0x80

"P3":                                  0x6a
  .near_func.text  ro code  0x008080   0x18  vreg_util.o [4]
  .near_func.text  ro code  0x008098   0x17  init.o [4]
  .near_func.text  ro code  0x0080af   0x14  __dbg_xxexit.o [3]
  .near_func.text  ro code  0x0080c3   0x13  cstartup.o [4]
  .near_func.text  ro code  0x0080d6    0x5  cexit.o [4]
  .near_func.text  ro code  0x0080db    0x3  interrupt.o [4]
  .near_func.text  ro code  0x0080de    0x3  low_level_init.o [4]
  .near_func.text  ro code  0x0080e1    0x3  exit.o [4]
  .near_func.text  ro code  0x0080e4    0x3  unhandled_exception.o [4]
  .near_func.text  ro code  0x0080e7    0x2  main.o [1]
  .near_func.text  ro code  0x0080e9    0x1  __dbg_break.o [3]
                          - 0x0080ea   0x6a



*******************************************************************************
*** MODULE SUMMARY
***

    Module                 ro code  ro data  rw data
    ------                 -------  -------  -------
C:\TMP\IAR\Debug\Obj: [1]
    main.o                       2
    ------------------------------------------------
    Total:                       2

command line: [2]
    ------------------------------------------------
    Total:

dbgstm8ssd.a: [3]
    __dbg_break.o                1
    __dbg_xxexit.o              20
    ------------------------------------------------
    Total:                      21

dlstm8ssn.a: [4]
    cexit.o                      5
    cstartup.o                  19
    exit.o                       3
    init.o                      23
    interrupt.o                  3      128
    low_level_init.o             3
    unhandled_exception.o        3
    vreg_util.o                 24
    vregs.o                                       12
    ------------------------------------------------
    Total:                      83      128       12

    Linker created                               256
----------------------------------------------------
    Grand Total:               106      128      268


*******************************************************************************
*** ENTRY LIST
***

Entry                    Address  Size  Type      Object
-----                    -------  ----  ----      ------
?b0                     0x000000        Data  Gb  vregs.o [4]
?b1                     0x000001        Data  Gb  vregs.o [4]
?b10                    0x00000a        Data  Gb  vregs.o [4]
?b11                    0x00000b        Data  Gb  vregs.o [4]
?b2                     0x000002        Data  Gb  vregs.o [4]
?b3                     0x000003        Data  Gb  vregs.o [4]
?b4                     0x000004        Data  Gb  vregs.o [4]
?b5                     0x000005        Data  Gb  vregs.o [4]
?b6                     0x000006        Data  Gb  vregs.o [4]
?b7                     0x000007        Data  Gb  vregs.o [4]
?b8                     0x000008        Data  Gb  vregs.o [4]
?b9                     0x000009        Data  Gb  vregs.o [4]
?e0                     0x000001        Data  Gb  vregs.o [4]
?e1                     0x000005        Data  Gb  vregs.o [4]
?e2                     0x000009        Data  Gb  vregs.o [4]
?l0                     0x000000        Data  Gb  vregs.o [4]
?l1                     0x000004        Data  Gb  vregs.o [4]
?l2                     0x000008        Data  Gb  vregs.o [4]
?push_w4                0x008080        Code  Gb  vreg_util.o [4]
?w0                     0x000000        Data  Gb  vregs.o [4]
?w1                     0x000002        Data  Gb  vregs.o [4]
?w2                     0x000004        Data  Gb  vregs.o [4]
?w3                     0x000006        Data  Gb  vregs.o [4]
?w4                     0x000008        Data  Gb  vregs.o [4]
?w5                     0x00000a        Data  Gb  vregs.o [4]
CSTACK$$Base            0x000300         --   Gb  - Linker created -
CSTACK$$Limit           0x000400         --   Gb  - Linker created -
INTVEC$$Base            0x008000         --   Gb  - Linker created -
INTVEC$$Limit           0x008080         --   Gb  - Linker created -
Region$$Table$$Base   0x00000000         --   Gb  - Linker created -
Region$$Table$$Limit  0x00000000         --   Gb  - Linker created -
__DebugBreak            0x0080e9   0x1  Code  Gb  __dbg_break.o [3]
__exit                  0x0080af  0x14  Code  Gb  __dbg_xxexit.o [3]
__iar_data_init2        0x008098  0x17  Code  Gb  init.o [4]
__iar_program_start     0x0080c3        Code  Gb  cstartup.o [4]
__iar_unhandled_exception
                        0x0080e4        Code  Gb  unhandled_exception.o [4]
__intvec                0x008000        Data  Gb  interrupt.o [4]
__low_level_init        0x0080de   0x3  Code  Gb  low_level_init.o [4]
_exit                   0x0080d6        Code  Gb  cexit.o [4]
exit                    0x0080e1   0x3  Code  Gb  exit.o [4]
main                    0x0080e7   0x2  Code  Gb  main.o [1]


[1] = C:\TMP\IAR\Debug\Obj
[2] = command line
[3] = dbgstm8ssd.a
[4] = dlstm8ssn.a

  106 bytes of readonly  code memory
  128 bytes of readonly  data memory
  268 bytes of readwrite data memory

Errors: none
Warnings: none
回复 支持 反对

使用道具 举报

发表于 2022-2-26 22:22:58 | 显示全部楼层
这下面是IAR编译器预留的虚拟寄存器,占用了0xc(12)字节。
"A1":                                   0xc
  .vregs           uninit   0x000000    0xc  vregs.o [4]
                          - 0x00000c    0xc

这下面是栈,占用0x100(256)字节。
"A2":                                 0x100
  CSTACK                    0x000300  0x100  <Block>
    CSTACK         uninit   0x000300  0x100  <Block tail>
                          - 0x000400  0x100

所以合计占用12+256=268字节。

打赏

参与人数 1家元 +20 收起 理由
kkstun + 20 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-2-26 22:25:12 | 显示全部楼层
栈大小是可以设置的。STM8的RAM最小都是1KB,比起51来说,富足多了。
只有在RAM不够用的时候,再来折腾这些配置吧。
回复 支持 反对

使用道具 举报

发表于 2022-2-26 22:45:21 | 显示全部楼层
kkstun 发表于 2022-2-23 13:45
还有个问题就是我这样也能编译成功?
unsigned char a[2000];

我设置为STM8S003F3是报错的,“Error[Lp011]: section placement failed  ”
CPU改为STM8S007C8 (6KRAM)就不会报错。
如果你不指定CPU,默认的“STM8 - Unspecified”也不会报错。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-6 05:20 , Processed in 0.249601 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表