C51 函数/程序段的定位
在Keil C中可能需要指定某个函数或者某段程序链接后存放在程序区中的位置。
1. 如何指定某个函数在程序区中的位置。
QUESTION
How do I locate a C function at an absolute address? I succeeded in variables using _at_, but it doesn’t work for functions.
ANSWER
You must use the BL51 Linker or LX51 Linker to locate functions at fixed addresses. To do so, make a note of the function name and the source file in which it is saved. The compiler creates a symbol name for the function using the following format:
?PR?function_name?file_name
So, the function named func in main.c would have a symbol name of:
?PR?FUNC?MAIN
Everything is uppercase to comply with the OMF51 standard.
There may be derivatives of this naming convention. For example, if the function accepts arguments that can all be passed in registers, the function name is prefixed with an underscore (‘_’) and the above would be:
?PR?_FUNC?MAIN
You may look in the linker’s map file to figure out the symbolic names for your functions.
Once you know the symbolic name, it is a simple matter of telling the linker where to locate it using the CODE directive. For example:
BL51 main.obj code(?pr?func?main(2000h))
Tells the linker to locate the function func at code address 0×2000.
If you use the µVision IDE you may enter the starting address for segments under Project – Options for Target. For the BL51 Linker/Locater enter the following code segment with the address under BL51 Locate – Code. For the LX51 Linker/Locater enter it under LX51 Locate – User Segments:
?pr?func?main(C:0x2000)
QUESTION
I am writing an IAP loader and would like to locate it in the first 1024 Bytes of my CODE memory. How can I ensure this? I have tried to use wildcards, but this did not work out, since it collidates with interrupt vectors.
ANSWER
The best approch is to locate the program code with a USER CLASS. User classes are an extension of the LX51 Linker/Locater (which is available in the PK51 Professional Developer’s Kit).
For example, you can write the following pragma within the C source files that contain the IAP loader program code:
#pragma userclass (code = IAP) // generates CODE_IAP class
This userclass directive places the program code of the module to the memory class CODE_IAP. Now you can separately locate this memory class when you enter it in µVision under Project – Options for Target – LX51 Locate – User Class. To locate the IAP code to the first 1KB of your program section enter here.
CODE_IAP (C:0 - C:0x3FF)
Note that you have to select the Use Extended Linker LX51 under Project – Options for Target – LX51 Locate – User Class.
MORE INFORMATION
Refer to USERCLASS in the Cx51 User’s Guide.
Refer to CLASSES in the LX51 User’s Guide.
补充:
1. 如果没有在“Options for Target”中找到“ LX51 Locate”标签,请先在“Device”标签页中选中“Use Extended Linker(LX51) instead of "BL51"
2. 指定的USERCLASS的地址不能和其他CODE 区的地址重叠,包括原始的CODE区。
C51 函数/程序段的定位的更多相关文章
- C51函数的递归调用
前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...
- 在Selenium Webdriver中使用XPath Contains、Sibling函数定位
前言 在一般情况下,我们通过简单的xpath即可定位到目标元素,但对于一些既没id又没name,而且其他属性都是动态的情况就很难通过简单的方式进行定位了. 在这种情况下,我们需要使用xpath1.0内 ...
- Linux pwn入门教程(10)——针对函数重定位流程的几种攻击
作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...
- UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流
1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. ...
- CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)
Linux Pwn入门教程系列分享已接近尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/a ...
- [PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据
对于大文件只获取部分数据很有用 1.使用ftell函数可以获取当前指针的字节位置2.使用fseek函数可以直接定位到指定的位置3.读取指定字节的数据就可以部分获取文件内容了 <?php clas ...
- keil c51笔记
第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...
- 深入剖析keil c51 --- 从汇编到c51
第一节 main()函数和启动代码 汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和 ...
- Keil C51 知识点
第一节 Keil C51扩展关键字 深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一.因为大多数扩展功能都是直接针对8051系列CPU硬件的.大致有以下8类: 8051存储类型 ...
随机推荐
- Unity 3D中的菜单项
1.File菜单:主要是包含项目和场景的创建.保存以及输出等功能.2.Edit(编辑)菜单:只要包括对场景进行一系列的编辑以及环境设置操作等命令.3.Assets(资源)菜单:掌握资源在Unity中的 ...
- centos Minicom通信终端
minicom是linux下的串口通信软件,他使用完全使用键盘操作.它虽然没有windows下的超级终端好用,但是它也是一种串口通信的方法.一.minicom安装在超级终端中输入:sally@sall ...
- 构建一个基于 Spring 的 RESTful Web Service
本文详细介绍了基于Spring创建一个“hello world” RESTful web service工程的步骤. 目标 构建一个service,接收如下HTTP GET请求: http://loc ...
- Laravel-路由-控制器
(慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.基础路由 二.多请求路由 三.参数路由 四.路由别名 生成url可以使用别名 五.路由群组 六.路由输出视图 七.控制器参数绑定
- Sybase安装后的配置工作
1.配置数据库参数 配置sybase数据库使用的最大内存 用isql命令行实用工具登录sybase数据库服务器,其中的servername是$SYBASE/interfaces文件中配置的sybase ...
- jquery之radio
<td class="queryTitle" width="80px">是否启用</td> <td class="que ...
- iOS模拟器分辨率的问题(转载)
转载地址:http://justsee.iteye.com/blog/2123545 不积跬步 无以至千里 不积小流 无以成江海 博客 微博 相册 收藏 留言 关于我 ios8/sdk ...
- ASP.NET中过滤HTML字符串的两个方法
先记下来,以作备用! /// <summary>去除HTML标记 /// /// </summary> /// <param name="Htmlstring& ...
- PowerDesigner与UML建模应用
一. PD简介 PowerDesigner 是一个集所有现代建模技术于一身的完整工具,它集成了强有力的业务建模技术.传统的数据库分析和实现,以及UML对象建模.通过了元数据的管理.冲突分析和真正的 ...
- Js得到radiobuttonlist选中值,设置默认值
JS 代码 var vRbtid=document.getElementById("rbtid"); //得到所有radio var vRbtidList= v ...