分散加载文件sct 的书写经验

来源:互联网 发布:湖南软件职业学院专业 编辑:程序博客网 时间:2024/06/11 20:47

有个人说的很对,sct就是要多写、多试才能出经验。


文件1就可以:

做法:同一集合的obj文件另起加载域存放。

好处:加载域首地址可以不接在上一个加载域的结尾。

------------------------------------ file1 -----------------------------------------------------------------------------

LR_IROM1 0x08000000 0x00034000  {    ; load region size_region          all=0x00040000     Size: 0x000079b0
  ER_IROM1 0x08000000 0x00034000  {  ; load address = execution address
   *.o (RESET, +First)
   * (+RO)          
  }
  RW_IRAM1 0x20000000 0x0000C000  {  ; RW data    
   * (+RW +ZI)
  }  
}

LR_IROM_FS 0x08034000 0x00003000  {    ; Size: 0x00002d5c(include RW data) 
  ER_IROM_FS 0x08034000 0x00003000  { 
   ff.o          (+RO)  ;under FS
   fattime.o     (+RO) 
   ccsbcs.o      (+RO)          
  }
}

LR_IROM_OS_CORE 0x08037000 0x00004000  {    ; Size: 0x00002ec0 
  ER_IROM_OS_CORE 0x08037000 0x00004000  { 
   os_core.o     (+RO)  ;under OS_CORE
   os_flag.o     (+RO)
   os_mem.o      (+RO)
   os_q.o        (+RO)
   os_sem.o      (+RO)
   os_task.o     (+RO)
   os_time.o     (+RO)       
  }
}

LR_IROM_OS_PORTS 0x0803B000 0x00001000  {    ; Size: 0x000002d8
  ER_IROM_OS_PORTS 0x0803B000 0x00001000  { 
   os_cpu_c.o    (+RO)  ;under OS_PORTS
   os_dbg.o      (+RO)       
  }
}



file2就不行:

做法:同一集合的obj文件另起运行域存放。

现象:运行时进hardfault

-------------------------------------- file2 ---------------------------------------------------------------------------

LR_IROM1 0x08000000 0x00040000  {    ; load region size_region          all=0x00040000     Size: 0x000079b0

  ER_IROM1 0x08000000 0x00030000  {  ; load address = execution address
   *.o (RESET, +First)
   * (+RO)          
  } 

  ER_IROM_FS 0x08030000 0x00003000  { 
   ff.o          (+RO)  ;under FS
   fattime.o     (+RO) 
   ccsbcs.o      (+RO)          
  }

  ER_IROM_OS_CORE 0x08033000 0x00004000  { 
   os_core.o     (+RO)  ;under OS_CORE
   os_flag.o     (+RO)
   os_mem.o      (+RO)
   os_q.o        (+RO)
   os_sem.o      (+RO)
   os_task.o     (+RO)
   os_time.o     (+RO)       
  }

  ER_IROM_OS_PORTS 0x08037000 {   ;0x00001000  
   os_cpu_c.o    (+RO)  ;under OS_PORTS
   os_dbg.o      (+RO)       
  } 

  RW_IRAM1 0x20000000 0x0000C000  {  ; RW data    
   * (+RW +ZI)
  }
}



结合图1来看分析,我猜(错了别怪我,不过应该没错,哈哈):在一个加载域里,多个运行域只能代表不同的段,包括RO、RW、ZI、NOINIT。如果两个运行域里的段的属性都是RO,那么运行域就没有起到合并同属性的段的目的,所以就hardfault了。比如file2里,前几个运行域里的段的属性都是RO,所以就错了。





0 0