Hi, I have a simple application such as a microcontroller having internal ROM, an ext. RAM placed from 0x8000-0xEFFF, and an EPROM placed from 0x0000 - 0x1FFF. The EPROM is purposed to hold only display messages defined in the c code such as char const xdata Message[] ="Hello"; I don't want to have any other code in that EPROM. I want besides the genarated program code to have a separate HEX file for these messages ready for the EPROM. For example in format HEX-80. How am I to configure the settings using uVison? I have read the artıcles and the thread: http://www.keil.com/forum/docs/thread2074.asp Also, all related threads or similar. However, I haven't understood: am I able to use XCONST type constants in an external memory and genarate a HEX file only containing them without having a code Banking? So far some of my setings are as follow: Checked boxes: OPTIONS-Device-Use Extended Linker(LX51) instead of BL51 OPTIONS-Target-Use On Chip ROM(0x0-0xFFFF) OPTIONS-Target-Off-chip Xdata Memory 0x8000 size 0x7000 OPTIONS-C51-Misc Controls: XCROM OPTIONS-LX51 Locate-Use Memory Layout from Target Dialog checked User Classes: XCONST (X:0x0000-X:0x3FFF) Thanks in advance for your concern! BR Oktay
OHX51 lcd.obj HEXFILE (lcd.hex) H386 RANGE(0x0000-0x1FFF) OFFSET(0) but this gave an error, as it would be expected, as lcd.obj is not an absolute object file. Yes. Instead of lcd.obj, you need to specify the Linker's absolute output file. By default, uVision gives this the same name as the Project file, but with no extension.
Andrew, Thank you for your comments! I see that you have understood my intention. There are 2 points I am not very clear with: 1. What is the difference if I use char const xdata instead of char const? Shall I keep the XCROM directive? I did this as it was advised in the Example of the user guide under section XCROM. Also, I have tried it and seems that there is no any difference in the map file. 2. Yes. Instead of lcd.obj, you need to specify the Linker's absolute output file. By default, uVision gives this the same name as the Project file, but with no extension. As I mentioned before, my project consists of several files and all are linked thus there exists one file containing project name as required by the OHX51. However, after running the command, this results in having the same HEX file as in the end of the general compilation. I guess this means that I am to create a new project only for this file and compile it separately. I don't know if there is a way to give a directive to give to the OHX51 to 'extract' only the const variables in a separate file. Am I wrong? What would you advise? Best regards, Oktay
"1. What is the difference if I use char const xdata instead of char const?" If you include the 'xdata' keyword, you are specifically telling the compiler to put the stuff in XDATA; you don't want it in XDATA - you want it in XCONST. Similarly, putting 'const code' would put it into CODE space instead of XCONST. Hence, you must just put 'const' with no memory-space qualifier. "Shall I keep the XCROM directive?" Yes! it is the XCROM that stops the tools from putting 'const' items into CODE space! ", I have tried it and seems that there is no any difference in the map file." The Map file should show 'const' items with a "Memory Class" of XCONST in the "MEMORY MAP OF MODULE: <you module name>" section. "As I mentioned before, my project consists of several files and all are linked thus there exists one file containing project name as required by the OHX51." Let's assume that your project is called "myproj" The Linker output file (absolute object file) will be 'myproj' and the Map file will be 'myproj.map' The absolute object file contains your code, and the constants, and the debug information (if enabled). Note that this relies on some Keil proprietary extensions to the Object Module Format (OMF) - which is why you also need to specify the OMF2 compiler option. When you check 'Create Hex File' in the uVision 'Output' options, it calls OH51 to extract just the code from the absolute object file, and create 'myproj.hex' What you need to do is to add an OHX51 command to extract just the constants from the absolute object file, and create, say, 'myproj_const.hex' "I don't know if there is a way to give a directive to give to the OHX51 to 'extract' only the const variables in a separate file." In the XCONST Linker directive, you should have specified the XDATA address range to be used by your contstants ROM; eg,
XCONST( X:0xE000-X:0xFFFF)
RANGE( X:0xE000-X:0xFFFF )
OFFSET( -0xE000 )
Hi Andrew, Thanks a lot! For me the required clue was RANGE( X:0xE000-X:0xFFFF ). It hadn't worked before for me because I used it as RANGE( 0xE000-0xFFFF ). Yesterday, I found out that if I don't specify ?XC?LCD(X:0x0) the Debugger error keeps coming. When I specified it like ?XC?LCD(0x0) it gave me SEGMENT errors. In the documents' examples for such directives, the memory ranges are specified such as (0x1000 - 0x2FFF) etc. without putting the memory descriptor X:, C:, I:. This solved my problem! However, I do insist that in my case using const or const xdata doesn't differ :-) They are compiled and mapped in the same way. Thank you for your time and help to resolve my problem! Best regards, Oktay Pehlivanoglu