久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3648|回復: 1
打印 上一主題 下一主題
收起左側

IAR STM32 函數和變量的絕對地址定位

[復制鏈接]
跳轉到指定樓層
樓主
ID:262 發表于 2016-3-11 23:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
昨天我突然冒出個想法,能否利用函數和變量的絕對定位,實現程序的模塊化更新。


也就是說,如果我要改變某個函數,只需要更新flash里面一個局部,也許只需要更新幾百個字節,而無須重新下載整個上百K的程序。


  經過查找資料和反復實驗,終于實現了,現總結如下:


  1)把函數定位在FLASH高端的指定位置,以后更新,只更新那小塊地方就可以了。


  方法一:


    IAR里面進行函數定位,必須要在.icf里面,進行定義。


   void sendstr(unsigned*buf,unsigned short  len)@".sendstr"
   {
    ....
   }


  .icf文件,加入這樣一句:
  place at address mem:0x08017000 { readonlysection .sendstr};


  方法二) 把要更新的函數,單獨放在一個.c文件中,然后再.icf文件里面,對該文件進行定位:
  test.c


  int f1(int a,int b){
  if(a>0){
   return(a+b)*1;
  }
  else return 0;
}
  int f2(int a,int b){
  if(a>0){
   return(a+b)*1;
  }
  else return 0;
}


那么在 .icf文件中,這樣寫:
place at address mem:0x08018000 { section .text object test.o};
編譯完成后, f1就定位在0x08018000處了,當然f2也緊跟在f1后面。整個test.c文件的所有函數,都在0x08018000之后。


如果有多個函數需要單獨更新,建議采用第二種方式,只需要對c文件編譯后的地址定位,那么該c文件的所有函數都定位了。


絕對定位的函數,只要指定了地址,那么在flash里面的位置就是固定的。




即使是兩個不同的工程,比如第一個工程為實際工程,里面有所有的工程文件, 第二個工程為更新專用工程,里面僅僅只有test.c文件,里面的函數是同名的,定位地址與第一個工程也一樣。


那么這樣編譯后,第二個工程里面的固件片斷,是可以用來更新一個工程的固件的。


這樣還可以派生出一個很怪的用法:
我可以把更新專用工程,公布給別人,他只需要在test.c里面,編寫函數的具體內容。然后一樣可以更新產品的固件。
真正的實際工程,是不需要公布的。


以上是對函數的絕對定位處理。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------


2)變量定位


變量絕對定位:
__no_init char array1[100]@0x2000B000;


變量絕對定位,無須修改.icf,直接指定


這個array1就定位在RAM中的0x2000B000處


常量絕對定位:
const char str1[8]@".MYSEG"="test11!!";
常量絕對定位,需要改.icf文件:
place at address mem:0x08018500 { readonly section.MYSEG};


------------------------------------------------------------------------------------------------------------------------------------------


3)跨工程固件更新注意事項:


固件更新區的絕對定位的函數,不能隨意調用其他庫函數,那些被調用的函數也必須是絕對定位的。否則跨工程更新固件,會導致失敗,因為被調用的函數在不同工程里,動態連接到的位置不同。


但是這個可以解決:被調用的函數,在兩邊工程都申明的絕對地址,并且在非固件更新區(就是兩邊工程的固件里,這些被調用函數的位置都一樣,只需要函數名和地址一樣即可,函數內部可以不同)。那么被這些調用的函數內,可以隨意調用其他函數,如printf,strcpy等庫函數了。


絕對定位的函數,如果要使用常量,那么被使用的常量也必須是絕對定位的。否則跨工程更新固件,會導致失敗。


絕對定位的函數,如果要使用全局變量,那么被使用的常量也必須是絕對定位的。否則跨工程更新固件,會導致失敗。 而局部變量則不受此限制。

  1. ###############################################################################
  2. #                                                                             #
  3. # IAR ELF Linker V5.50.0.51878/W32 for ARM              31/May/2012  12:50:09 #
  4. # Copyright (C) 2007-2010 IAR Systems AB.                                     #
  5. #                                                                             #
  6. #    Output file  =  E:\stm32\software4.45.2\Debug\Exe\software.out           #
  7. #    Map file     =  E:\stm32\software4.45.2\Debug\List\software.map          #
  8. #    Command line =  E:\stm32\software4.45.2\Debug\Obj\main.o                 #
  9. #                    E:\stm32\software4.45.2\Debug\Obj\test.o -o              #
  10. #                    E:\stm32\software4.45.2\Debug\Exe\software.out --map     #
  11. #                    E:\stm32\software4.45.2\Debug\List\software.map          #
  12. #                    --config E:\stm32\software4.45.2\stm32f10x_flash.icf     #
  13. #                    --semihosting --entry __iar_program_start                #
  14. #                                                                             #
  15. #                                                                             #
  16. ###############################################################################

  17. *******************************************************************************
  18. *** PLACEMENT SUMMARY
  19. ***

  20. "A1":  place at 0x08004000 { ro section .intvec };
  21. "A2":  place at 0x08017000 { ro section .sendstr };
  22. "A3":  place at 0x08018500 { ro section .MYSEG };
  23. "A4":  place at 0x08018000 { object test.o section .text };
  24. "P1":  place in [from 0x08004000 to 0x08020000] { ro };
  25. "P2":  place in [from 0x20000000 to 0x2000bfff] {
  26.           rw, block CSTACK, block HEAP };

  27.   Section            Kind        Address   Size  Object
  28.   -------            ----        -------   ----  ------
  29. "A1":                                      0x40
  30.   .intvec            ro code  0x08004000   0x40  vector_table_M.o [4]
  31.                             - 0x08004040   0x40

  32. "P1":                                     0x100
  33.   .text              ro code  0x08004040   0x30  copy_init3.o [4]
  34.   .text              ro code  0x08004070   0x2c  data_init3.o [4]
  35.   .text              ro code  0x0800409c   0x28  iarttio.o [5]
  36.   .iar.init_table    const    0x080040c4   0x14  - Linker created -
  37.   .text              ro code  0x080040d8   0x16  cmain.o [4]
  38.   .text              ro code  0x080040f0   0x14  exit.o [5]
  39.   .text              ro code  0x08004104    0xc  cstartup_M.o [4]
  40.   .text              ro code  0x08004110    0xa  cexit.o [4]
  41.   .text              ro code  0x0800411a    0xa  main.o [1]
  42.   .text              ro code  0x08004124    0x8  XShttio.o [3]
  43.   .text              ro code  0x0800412c    0x6  exit.o [3]
  44.   .text              ro code  0x08004132    0x4  low_level_init.o [3]
  45.   .text              ro code  0x08004136    0x2  vector_table_M.o [4]
  46.   Initializer bytes  ro data  0x08004138    0x8  
  47.                             - 0x08004140  0x100

  48. "A2":                                       0x2
  49.   .sendstr           ro code  0x08017000    0x2  main.o [1]
  50.                             - 0x08017002    0x2

  51. "A4":                                      0x54
  52.   .text              ro code  0x08018000   0x54  test.o [1]
  53.                             - 0x08018054   0x54

  54. "A3":                                      0x10
  55.   .MYSEG             const    0x08018500   0x10  test.o [1]
  56.                             - 0x08018510   0x10

  57. "P2", part 1 of 2:                        0x400
  58.   CSTACK                      0x20000000  0x400  
  59.     CSTACK           uninit   0x20000000  0x400  
  60.                             - 0x20000400  0x400

  61. "P2", part 2 of 2:                          0x8
  62.   P2 s0                       0x20000400    0x8  
  63.     .data            inited   0x20000400    0x8  XShttio.o [3]
  64.                             - 0x20000408    0x8


  65. *******************************************************************************
  66. *** INIT TABLE
  67. ***

  68.           Address     Size
  69.           -------     ----
  70. Copy (__iar_copy_init3)
  71.     1 source range, total size 0x8 (100% of destination):
  72.           0x08004138   0x8
  73.     1 destination range, total size 0x8:
  74.           0x20000400   0x8


  75. *******************************************************************************
  76. *** MODULE SUMMARY
  77. ***

  78.     Module            ro code  ro data  rw data
  79.     ------            -------  -------  -------
  80. E:\stm32\software4.45.2\Debug\Obj: [1]
  81.     main.o                 12
  82.     test.o                 84       16
  83.     -------------------------------------------
  84.     Total:                 96       16

  85. command line: [2]
  86.     -------------------------------------------
  87.     Total:

  88. dl7M_tl_in.a: [3]
  89.     XShttio.o               8        8        8
  90.     exit.o                  6
  91.     low_level_init.o        4
  92.     -------------------------------------------
  93.     Total:                 18        8        8

  94. rt7M_tl.a: [4]
  95.     cexit.o                10
  96.     cmain.o                22
  97.     copy_init3.o           48
  98.     cstartup_M.o           12
  99.     data_init3.o           44
  100.     vector_table_M.o       66
  101.     -------------------------------------------
  102.     Total:                202

  103. shb_l.a: [5]
  104.     exit.o                 20
  105.     iarttio.o              40
  106.     -------------------------------------------
  107.     Total:                 60

  108.     Gaps                    2
  109.     Linker created                  20    1 024
  110. -----------------------------------------------
  111.     Grand Total:          378       44    1 032


  112. *******************************************************************************
  113. *** ENTRY LIST
  114. ***

  115. Entry                    Address  Size  Type      Object
  116. -----                    -------  ----  ----      ------
  117. BusFault_Handler      0x08004137        Code  Wk  vector_table_M.o [4]
  118. CSTACK$Base          0x20000000         --   Gb  - Linker created -
  119. CSTACK$Limit         0x20000400         --   Gb  - Linker created -
  120. DebugMon_Handler      0x08004137        Code  Wk  vector_table_M.o [4]
  121. HardFault_Handler     0x08004137        Code  Wk  vector_table_M.o [4]
  122. MemManage_Handler     0x08004137        Code  Wk  vector_table_M.o [4]
  123. NMI_Handler           0x08004137        Code  Wk  vector_table_M.o [4]
  124. PendSV_Handler        0x08004137        Code  Wk  vector_table_M.o [4]
  125. Region

  126. Table
  127. Base   0x080040c4         --   Gb  - Linker created -
  128. Region
  129. Table
  130. Limit  0x080040d8         --   Gb  - Linker created -
  131. SVC_Handler           0x08004137        Code  Wk  vector_table_M.o [4]
  132. SysTick_Handler       0x08004137        Code  Wk  vector_table_M.o [4]
  133. UsageFault_Handler    0x08004137        Code  Wk  vector_table_M.o [4]
  134. __cmain               0x080040d9        Code  Gb  cmain.o [4]
  135. __exit                0x080040f1  0x14  Code  Gb  exit.o [5]
  136. __iar_close_ttio      0x0800409d  0x26  Code  Gb  iarttio.o [5]
  137. __iar_copy_init3      0x08004041  0x30  Code  Gb  copy_init3.o [4]
  138. __iar_data_init3      0x08004071  0x2c  Code  Gb  data_init3.o [4]
  139. __iar_lookup_ttioh    0x08004125   0x8  Code  Gb  XShttio.o [3]
  140. __iar_program_start   0x08004105        Code  Gb  cstartup_M.o [4]
  141. __iar_ttio_handles    0x20000400   0x8  Data  Lc  XShttio.o [3]
  142. __low_level_init      0x08004133   0x4  Code  Gb  low_level_init.o [3]
  143. __vector_table        0x08004000        Data  Gb  vector_table_M.o [4]
  144. _call_main            0x080040e5        Code  Gb  cmain.o [4]
  145. _exit                 0x08004111        Code  Gb  cexit.o [4]
  146. _main                 0x080040eb        Code  Gb  cmain.o [4]
  147. exit                  0x0800412d   0x6  Code  Gb  exit.o [3]
  148. f1                    0x08018049   0xc  Code  Gb  test.o [1]
  149. main                  0x0800411b   0xa  Code  Gb  main.o [1]
  150. sendstr               0x08017001   0x2  Code  Gb  main.o [1]
  151. str1                  0x08018500   0x8  Data  Gb  test.o [1]
  152. str2                  0x08018508   0x8  Data  Gb  test.o [1]
  153. test                  0x08018001  0x44  Code  Gb  test.o [1]


  154. [1] = E:\stm32\software4.45.2\Debug\Obj
  155. [2] = command line
  156. [3] = dl7M_tl_in.a
  157. [4] = rt7M_tl.a
  158. [5] = shb_l.a

  159.     378 bytes of readonly  code memory
  160.      44 bytes of readonly  data memory
  161.   1 032 bytes of readwrite data memory

  162. Errors: none
  163. Warnings: none
  164. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  165. 這是.icf文件

  166. define symbol __ICFEDIT_intvec_start__ = 0x08004000;
  167. define symbol __ICFEDIT_region_ROM_start__   = 0x08004000;
  168. define symbol __ICFEDIT_region_ROM_end__     = 0x08020000;
  169. define symbol __ICFEDIT_region_RAM_start__   = 0x20000000;
  170. define symbol __ICFEDIT_region_RAM_end__     = 0x2000BFFF;
  171. define symbol __ICFEDIT_size_cstack__   = 0x400;
  172. define symbol __ICFEDIT_size_heap__     = 0x200;


  173. define memory mem with size = 4G;
  174. define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];
  175. define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

  176. define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
  177. define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

  178. initialize by copy { readwrite };
  179. do not initialize  { section .noinit };

  180. place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

  181. place at address mem:0x08017000 { readonly section .sendstr};
  182. place at address mem:0x08018500 { readonly section .MYSEG};

  183. place at address mem:0x08018000 { section .text object test.o };

  184. place in ROM_region   { readonly };
  185. place in RAM_region   { readwrite,
  186.                         block CSTACK, block HEAP };

  187. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  188. main.c

  189. //#include "stm32f10x.h"
  190. #include "string.h"
  191. #include "stdio.h"

  192. void sendstr(unsigned *buf,unsigned short  len) @".sendstr"
  193. {
  194. }

  195. extern void test(void);
  196. extern void main1(void);
  197. int main(void)
  198. {
  199.      test();
  200. }

  201. #ifdef  USE_FULL_ASSERT
  202. void assert_failed(uint8_t* file, uint32_t line)
  203. {



  204.   while (1)
  205.   {
  206.   }
  207. }
  208. #endif




  209. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  210. test.c

  211. //__no_init char array1[100]@0x2000B000;

  212. //char array1[100];

  213. const char str1[8]@".MYSEG"="test11!!";
  214. const char str2[8]@".MYSEG"="test66!!";


  215. int f1(int a,int b);
  216. void test(void)// @".test" //MYSEGMENT段可在XCL中開辟
  217. {
  218.     char arrayx[150];  
  219.     char array1[150];
  220.     int i,a,b,c;
  221.     for (i=0;i<8;i++){
  222.       array1[i]=str1[i];      
  223.       arrayx[i]=str2[i];      
  224.     }
  225.     a=1;
  226.     b=2;
  227.     c=f1(a,b);
  228.     for (i=0;i
  229.       sendstr(array1,8);   
  230.       sendstr(arrayx,8);   
  231.     }
  232. }

  233. int f1(int a,int b){
  234.   if(a>0){
  235.    return (a+b)*1;
  236.   }
  237.   else return 0;
  238. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:262 發表于 2016-3-11 23:26 | 只看該作者
51黑有你更精彩。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频免费 | 亚洲国产精品久久久久婷婷老年 | 大象视频一区二区 | 国产成人精品午夜 | 国产精品区二区三区日本 | 免费在线色| 91精品国产综合久久久动漫日韩 | 一区二区三区视频 | 亚洲精品在线免费 | 97精品超碰一区二区三区 | 在线观看黄免费 | 女生羞羞视频 | 精品国产一区二区三区久久 | 色888www视频在线观看 | 亚洲精品久久久久久久不卡四虎 | 精品欧美乱码久久久久久1区2区 | 91免费观看国产 | 欧美一区二区三区在线 | 精品成人 | 国产精品日韩欧美一区二区 | 91免费版在线观看 | 日韩精品一区二区三区中文字幕 | 久久久久国产精品 | 国产精品一区三区 | 亚洲一区二区三区视频免费观看 | h漫在线观看| 综合色在线 | 精品国产乱码久久久久久丨区2区 | 日韩高清电影 | 91精品国产91久久久久久最新 | 亚洲国产二区 | 亚洲精品久久久久中文字幕欢迎你 | 国产最好的av国产大片 | 亚洲欧美一区二区在线观看 | 亚洲精品久久久久久久久久久久久 | 红色av社区 | 一区二区三区日韩精品 | 国产99小视频 | 日韩欧美第一页 | 亚洲午夜网 | 久久久久久久久久久高潮一区二区 |