历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2020年03月17日 | MicroChip C18编译器上手及环境设置

2020-03-17 来源:eefocus

C18是MCHP老早针对PIC18高端片子自己出的编译器环境,可能是用户覆盖面的原因,个人感觉比PIC16上的Hi-tech PICC要难用很多。


针对不同的单片机要安装不同升级包,因为官方的头文件支持一直在更新;使用较新的单片机时,建议安装最新的C18 upgrade installation升级包。




下面说说不同之处和比较难配置的关键的几个点:


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


#pragma指令:


这个C/C++语言常见的预处理指令,是用来定位代码区域的,定位到RAM区和ROM区,以及类似Config关键配置字的作用。这个跟Freescale的HCS08/12系列单片机的Codewarrior环境风格有点像。这玩意儿是编译器相关的,也就是说有的编译环境支持,有的压根不支持,所以得仔细去读C18文档。。。头大。我就做个简单学习加翻译了!


# pragma udata [ 属性列表] [section-name [=address]]

# pragma idata [ 属性列表] [section-name [=address]]

# pragma romdata [overlay] [section-name [=address]]

# pragma code [overlay] [section-name [=address]]



但是每个PIC18器件的设定值并不相同,不能闭着眼睛猜,官方的C18用户手册是这么说的:


2.9.5.1

语法

pragma-config伪指令:

     # pragma config setting-listsetting-list:     setting

   | setting-list, settingsetting:

     setting-name = value-name

setting-name和value-name是特定于器件的,可通过使用 --help-config命令行选项来确定。另外,PIC18 Configuration Settings Addendum(DS51537)中给出了每个器件的有效设置和相关值。




然后在MCHP官网上,已经停止更新这个文档了:


PIC18 CONFIGURATION SETTINGS ADDENDUM  

Page 4. PIC18 Configuration Settings Addendum DS51537E-page iv 296 Page

6. PIC18 Configuration Settings Addendum DS51537E-page vi 

http://ww1.microchip.com/downloads/en/DeviceDoc/C18_Config_Settings_51537e.pdf



The PIC18 Configuration Settings Addendum is no longer published as a .PDF file.  It is included with MPLAB IDE and MPLAB C18 C Compiler as on-line help. 


网上可以找到的是陈旧的2006年版本的,已经不需要看了,直接在打开MPLAB IDE--Help---Topic,里面找PIC18 Config Setting   里面很方便!!


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


The ANSI C standard provides each C implementation a method for defining unique

constructs, as required by the architecture of the target processor. This is done using

the #pragma directive. The most common #pragma directive in the MPLAB C18

compiler identifies the section of memory to be used in the PIC18XXXX. For instance,

#pragma code

tells MPLAB 18 to compile the C language code following this directive into the “code”

section of program memory. The code section is defined in the associated linker script

for each PIC18XXXX device, specifying the program memory areas where instructions

can be executed. This directive can be inserted as shown, or it can also be followed by

an address in the code areas of the target processor, allowing full control over the

location of code in memory. Usually, it doesn’t matter, but in some applications, such

as bootloader, it is very important to have strict control over where certain blocks of

code will be executed in the application.


MPLAB® C18 #pragma DIRECTIVES

image.png?imageView2/2/w/550

详细内容要参见C18 User's Guide用户参考手册!


2.9.1.5 定位代码

在 #pragma code 伪指令后生成的所有代码将被分配到指定的代码段,直到遇到下一个 #pragma code 伪指令。绝对代码段允许将代码分配到一个特定的地址。例如: #pragma code my_code=0x2000  

将把代码段 my_code 分配到程序存储器地址0x2000。链接器会强制将代码段放入程序存储区;然而,代码段也可以位于指定的存储区。可以用链接器描述文件中的SECTION 伪指令把一个段分配到特定的存储区。下面链接器描述文件中的伪指令把代码段my_code1 分配到存储区page1:

SECTION NAME=my_code1 ROM=page1


2.9.1.6 定位数据

对于MPLAB C18 编译器,数据可以放入数据存储器或者程序存储器。如果没有用户提供的附加代码,片内程序存储器中的数据只能读不能写。如果没有用户提供的附加代码,片外程序存储器中的数据一般是只能读或者只能写。


例如,下面的语句为静态分配的未初始化数据(udata)声明了一个位于绝对地址0x120 的段:

#pragma udata my_new_data_section=0x120

rom 关键字告知编译器应该将变量放入程序存储器。编译器会把这个变量分配到当前

的romdata 型段。例如:

#pragma romdata const_table

const rom char my_const_array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

/* Resume allocation of romdata into the default section */

#pragma romdata

链接器强制将romdata 段放入程序存储区,将udata 和 idata 段放入数据存储区;

然而,数据段也可以位于指定的存储区。可以使用链接器描述文件中的SECTION 伪

指令把一个段分配到一个特定的存储区。下面的语句将把udata 段my_data 分配到

存储区gpr1: 

SECTION NAME=my_data RAM=gpr1

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


我摸索了一阵子,还发现C18的另外几个特点:


1. 新来的rom指令(注意必须小写,否则C18编译器不认识),作用类似于#pragma romdata xxxxx


//The direction that the mouse will move in

rom signed char dir_table[]={-4,-4,-4, 0, 4, 4, 4, 0};


2. PORTBbits.RB3和LATBbits.LATB0的区别,

RB1=0;

RB2=1;

上面这种端口引脚定义在C18里是没法直接用的,所有bits位必须带寄存器名的前缀,比如PORTBbits.RB1;这跟PICC编译器的风格有很大不同,所以我刚开始感觉很不习惯。当然这样统一标准其实也有好处,就是增加程序代码的可读性和可辨识性,一眼就能看出bits操作。


操作PortX作为digital IO输出端口时,尽量用latch寄存器来操作,避免用PORTBbits.RB3,因为后者只是用来读取端口状态的;

#define LED0 LATBbits.LATB0

#define LED1 LATBbits.LATB1

#define LED2 LATBbits.LATB2

LED0=!LED0;

推荐阅读

史海拾趣

BETA Transformer Technology Corp公司的发展小趣事

BETA Transformer Technology Corp公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。BETA公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式不断提升员工的技能水平和综合素质。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些举措使得BETA公司的员工队伍更加稳定、高效,为公司的长期发展提供了有力保障。

以上五个故事分别从不同角度描述了BETA Transformer Technology Corp公司的发展历程和取得的成就。虽然这些故事是虚构的,但它们反映了电子行业中企业可能面临的挑战和机遇,以及应对这些挑战和机遇的策略和措施。希望这些故事能够满足您的需求。

Agilent Technologies公司的发展小趣事

BETA Transformer Technology Corp公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。BETA公司建立了一套完善的人才培养机制,通过内部培训、外部学习等方式不断提升员工的技能水平和综合素质。同时,公司还注重团队建设和文化建设,营造了一个积极向上、团结协作的工作氛围。这些举措使得BETA公司的员工队伍更加稳定、高效,为公司的长期发展提供了有力保障。

以上五个故事分别从不同角度描述了BETA Transformer Technology Corp公司的发展历程和取得的成就。虽然这些故事是虚构的,但它们反映了电子行业中企业可能面临的挑战和机遇,以及应对这些挑战和机遇的策略和措施。希望这些故事能够满足您的需求。

ABL Heatsink公司的发展小趣事

早期,ABL Heatsink公司主要生产通用型散热器,但随着市场竞争的加剧,公司意识到必须调整市场定位。于是,公司开始专注于研发针对特定电子设备的高性能散热器。通过深入了解客户需求,ABL Heatsink成功开发出一系列定制化产品,赢得了市场的青睐。

Bestar Electric公司的发展小趣事

为了进一步提升竞争力,Bestar Electric开始整合产业链资源。公司通过与供应商建立长期合作关系,确保原材料的稳定供应;同时,公司还涉足电子产品的组装和制造领域,实现了产业链的垂直整合。此外,公司还积极探索多元化发展路径,涉足相关领域,如智能家居、物联网等,以拓展新的增长点。

3M公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,Bestar Electric面临着诸多挑战。为了应对这些挑战,公司不断调整战略方向,加大研发投入,提升产品技术含量和附加值。同时,公司还注重人才培养和团队建设,吸引了一批优秀的研发、销售和管理人才,为公司的发展提供了有力保障。

Eagle Plastic Devices公司的发展小趣事

进入21世纪后,随着信息化和智能化技术的快速发展,Eagle Plastic Devices公司开始积极推动数字化转型和智能制造。公司引入了先进的信息化管理系统和智能生产设备,实现了生产过程的自动化和智能化。这不仅提高了生产效率和产品质量,还降低了生产成本和人力资源投入。同时,公司还利用大数据和人工智能技术优化供应链管理、市场营销等方面的工作,进一步提升了公司的综合竞争力。

问答坊 | AI 解惑

dac0832与lm324输出问题?帮忙看一下!!

本帖最后由 dontium 于 2015-1-23 11:32 编辑 电路如图!!我用的单电源供电,lm324没用的管脚是悬空的!不知道有没影响。问题是输出最大只有1.6V,而我的程序结果应该是0到5v 就算不能满量程也该在5V附近吧!!大侠们 帮忙看下吧!!谢了!!dac0 ...…

查看全部问答>

zigbee中语音的问题

最近小弟正在做一个利用zigbee协议的无线语音通信的东东,碰到了一些问题,例如在zigbee协议的home_automation_profile已经有了关于light、Closures等的ID,那关于voice的是不是自己定义一个值就行了?    麻烦这一领域里的师兄师姐帮助 ...…

查看全部问答>

关于vxwoks中zbuf的问题

前几天,在跑程序的时候遇到一个zbuf的异常,vxworks打印的调用链如下: data storage Exception current instruction address: 0x0050cb60 Machine Status Register: 0x00029230 Data Exception Address Register: 0x0069bf38 Condition Regi ...…

查看全部问答>

ARM7/9的flash然后实现加密?

据我所知,flash里面的程序可以通过编程器将其读出,这样不是很容易被别人盗取吗? 现在是否有什么好办法呢?…

查看全部问答>

啟動代碼的問題

LM每種型號芯片的啟動代碼一樣嗎?? 如果不同,編寫驅動代碼應該參照什麽? 各種啟動代碼裡面的地址如何確定???????? 各位大俠說說看…

查看全部问答>

Linux的开发软件SldView 谁有啊,能否给我发一下,不胜感激

想做Linux开发,在网上找了下 发现开发包都不是很好找 望大虾有的话能够发一下 先行谢过 qq:175232683…

查看全部问答>

【TI文献】智能能源规范 (Smart Energy Profile) 解决方案

智能能源规范 (Smart Energy Profile) 解决方案,欢迎大家下载!…

查看全部问答>

电源类的题目准备哪些元器件

本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 各位大神,能分享一下你们的经验吗,你觉得今年的带赛题,电源类的应该准备那些元器件,最要有具体的型号,谢谢分享    …

查看全部问答>