热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MSP430的intrinsics.h详解

来源:智拓仪器杭州精诚电子工作室1.1.1扩展关键字1.asm也可以写成_asm。功能是在c程序中直接嵌入汇编语言。asm(“string”);
来源:智拓仪器杭州精诚电子工作室


1.1.1 扩展关键字
      1. asm 也可以写成 _asm。功能是在c程序中直接嵌入汇编语言。 asm(“string”); 其中string必须是有效的汇编语句。
      2. __interrupt 放在函数前面,标志中断函数。下面这段程序是异步串行口UART0的接受中断函数。UART0RX_VECTOR为异步串行口UART0的接受中断向量。 举例: #pragma vector=UART0RX_VECTOR __interrupt void UARTO_R(void) { TXBUF0=RXBUF0; }
      3. __monitor 放在函数前面,功能是当这一函数执行的时候自动关闭中断。应该尽量缩短这样的函数,否则,中断事件无法得到及时的响应。
      4. __no_init 放在全局变量前面,功能是使程序启动时不为变量赋初值。
       5. __raw 编译中断函数时,编译器会自动生成一段代码,首先保存当时所用到CPU内寄存器的内容,退出中断程序时再进行恢复。将__raw放在中断函数前可禁止保存CPU内寄存器的过程,当然退出时也不会恢复。是否为中断函数使用此关键字需要更具具体情况而定。
       6. __regvar 放在变量前面,作用是声明变量为寄存器变量。可以用于整数、指针、32位浮点数以及只含有一个元素的结构和联合体。寄存器变量的地址只能为R4或者R5,也不能使用指针指向这个寄存器变量,而且必须用__no_init禁止初始化。 如: __regvar __no_init unsigned char q0 @ __R4; 其他不常用的关键字还有:__data16、__intrinsic、__noreturn、__root、__task、__word16。
1.1.2 内部函数
        1. __bcd_add_short Unsigned short __bcd_add_short(unsigned short,unsigned short); 功能:两个16为BCD格式的数字相加,返回和。
        2. __bcd_add_long Unsigned long __bcd_add_long(unsigned long,unsigned long); 功能:两个32位BCD格式的数字相加,返回和。
        3. __bcd_add_long_long 功能:两个64位BCD格式的数字相加,返回和。
       4. __bic_SR_register Void _bic_SR_register(unsigned short); 功能:将CPU中SR寄存器中的某些位清零。其参数为屏蔽码,需要清零的位为1。
       5. __bic_SR_register_on_exit Void __bic_SR_register_on_exit(unsigned short); 功能:用于一个中断函数或者不可中断函数(标志为__monitor)返回时,将CPU内SR寄存器中得某些位清0.其参数为屏蔽码,需要清零的位为1.
       6. __bis_SR_register Void __bis_SR_register(unsigned short); 功能:将CPU中SR寄存器中得某些位置1.其参数为屏蔽码,需要置1的位为1.
       7. __bis_SR_register_on_exit Void __bis_SR_register_on_exit(unsigned short); 功能:用于一个中断函数或者不可中断函数(标志为__monitor)返回时,将CPU内SR寄存器中得某些位置1.其参数为屏蔽码,需要置1的位为1.
       8. __disable_interrupt Void __disable_interrupt(void); 功能:关闭全局中断。先执行DINT指令,关闭全局中断,然后再执行NOP指令。空指令是为了确保关闭了全局中断之后再执行下面的程序。  
       9. __enable_interrupt Void __enable_interrupt(void); 功能:使用_EINT()指令打开全局中断。
       10. __even_in_range Unsigned short __even_in_range(unsigned short value,unsigned short upper_limit);
功能:只能与switch语句结合使用,判断value是否为偶数且小于等于upper_limit.
举例:
Unsigned int MoonRiver,iq0; Iq0=2;
Switch(__even_in_range(iq0,4))
{
Case 0:
MoOnRiver=0;
Break;
Case 2:
MoOnRiver=2;
break;
} 结果:假设iq0的值为2,执行完毕时MoOnRiver=2.否则,与普通的switch语句一样,跳过case部分,直接执行下面的程序。使用__even_in_range的好处是可以生成效率比较高的代码,在判断多中断源时可以使用此函数。
       11. __get_interrupt_state Istate_t __get_interrupt_state(void); 功能:返回当前的中断状态。返回值istate_t为一结构,通过此函数可以将获得当前的中断状态并保存,将来可以使用__set_interrupt_state恢复中断状态。
       12. __get_R4_register Unsigned short __get_R4_register(void); 功能:返回寄存器R4的值,只在R4被锁定时有效。
       13. __get_R5_register Unsigned short __get_R5_register(void); 功能:返回寄存器R5的值,只在R5被锁定时有效。
       14. __get_SP_register Unsigned short __get_SP_register(void); 功能:返回堆栈指针寄存器SP的值。
       15. __get_SR_register Unsigned short __get_SR_register(void); 功能:返回CPU中状态寄存器SR的值。
       16. __get_SR_register_on_exit Unsigned short __get_SR_register_on_exit(void); 功能:用于一个中断函数或者不可中断函数(标志为__monitor)返回时,返回状态寄存器SR的值。只在中断函数或者不可中断函数中有效。
       17. __low_power_mode_n Void __low_power_mode_n(void); 功能:进入低功耗模式0~4.
       18. __low_power_mode_off_on_exit Void __low_power_mode_off_on_exit(void); 功能:从一个中断函数或者不可中断函数(标志为__monitor)返回时退出低功耗模式。只在 中断或者不可中断函数中有效。
       19. __no_operation Void __no_operation(void); 功能:执行NOP指令。
       20. __op_code __op_code(unsigned short); 功能:在指令流中插入一个常数。
       21. __segment_begin Void *__segment_begin(segment); 功能:segment 是段的名字,必须是字符串。返回指向segment段的地址。此处的段是程序中定义的数据段、代码段、堆栈段等,一般用户可以使用编译器的默认设置。
       22. __segment_end Void *__segment_end(segment); 功能:segment是段的名字,必须是字符串。返回指向segment 段结束后的第一个字节的地址。
       23. __set_interrupt_state Void __set_interrupt_state(istate_t); 功能:恢复istate_t中保存的中断状态。
       24. __set_R4_register Void __set_R4_register(unsigned short); 功能:将unsigned short值赋给寄存器R4,只在R4被锁定时有效。    
       25. __set_R5_register Void __set_R5_register(unsigned short); 功能:将unsigned short 值赋给寄存器R5,只在R5被锁定时有效。
       26. __set_SP_register Void __set_SP_register(unsigned short); 功能:给堆栈指针寄存器SP赋值。
       27. __swap_bytes Unsigned short __swap_bytes(unsigned short); 功能:一个16位的无符号整数,高8位与低8位进行交换。如0x1234交换后0x3412.
1.1.3 扩展定义
       1. PxIN、PxOUT、PxDIR、PxSEL X为端口号。IN为端口输入寄存器,OUT为端口输出寄存器,DIR为端口方向控制寄存器,SEL为端口第二功能选择寄存器。 举例: Moon=P1IN;//读端口P1的值 P3OUT=5;//P3端口输出5 P2DIR=0XF0;//P2端口的高四位为输出,低4位为输入 P6SEL=0XF;//P6端口的高四位用作I/O端口,低4位用于第二功能
       2. BITx X的取值范围为0~F。代表寄存器的某一位。
其定义为:
#define BIT0 (0X0001)
#define BIT1 (0X0002)
… …
#define BITE (0X4000)
#define BITF (0X8000)
BIT0为最低位,BITF为最高位。MSP430是不支持位操作的,如果想对位操作,最好的方法就是通过位屏蔽来实现。
举例: P1OUT|=BIT0;//将P1口的最低位输出置1
P1OUT&=~BIT7;//将P1口的最高位输出清0,P1口只有8位
       3. LMPx X:0~4.进入0~4低功耗模式。其定义为: #define LPM0 _BIS_SR(LPM0_bits)//进入低功耗模式0 …
#define LPM0 _BIS_SR(LPM4_BITS)//进入低功耗模式4
从以上代码可以看出扩展定义是对内部函数的二次包装
举例: LPM0;//进入低功耗模式0
LPM4;//进入低功耗模式4
       4. LPMx_EXIT X:0~4。退出0~4低功耗模式。
其定义为: #define LPM0_EXIT _BIC_SR_IRQ(LPM0_bits)//退出低功耗模式0 …
#define LPM4_EXIT _BIC_SR_IRQ(LPM4_bits)//退出低功耗模式4 举例: LPM0_EXIT; LPM4_EXIT;
       5. _EINT() 打开全局中断控制,使GIE=1。
       6. _DINT() 关闭全局中断控制,使GIE=0.执行__disable_interrupt指令。
       7. _NOP() 空操作。执行__no_operation指令。
       8. _OPC(x) 在指令流中插入一个常数。X为unsigned char 类型。执行__op_code指令。
       9. _SWAP_BYTES(x) X是一个16位的无符号整数,高8位与低8位进行交换。执行__swap_bytes指令。
       10. __no_init [数据类型] 变量名 @ 地址 在某一固定地址处定义一个不进行初始化的变量,地址可以在RAM或FLASH内。如果使用此方式定义在RAM内的变量需要赋值,那么必须先定义,然后才能赋值。
举例: /*分配变量MoonRiver在RAM地址0x210*/
__no_init unsigned int MoonRiver @ 0x210;//没有初始化
MoOnRiver=100; //初始化MoonRiver 为100
/*分配变量MoonRiver在FLASH地址0XFFC0*/
__no_init float MoonRiver @0Xffc0; /*分配数组MoonRiver[3] 在RAM地址0X200*/
__no_init char MoonRiver[3] @0x200; /*分配结构sMoonRiver在RAM地址0X200*/
typedef struct
{
Unsigned char q0;
Unsigned char iq0;
}sMoonRiver; //定义一个结构型的数据类型,名为sMoonRiver
__no_init sMoonRiver MoonRiver @0x200;//声明变量MoonRiver,其数据类型为sMoonRiver MoonRiver.q0=100; MoonRiver.iq0=1000; //为MoonRiver赋初值
       11. Const [数据类型] 变量名 @ 地址 在某一固定地址处定义一个只读变量,并且只能在定义的时候赋初值。这种定义变量的方式在FLASH的固定地址处分配变量时非常有用。
举例: /*分配变量MoonRiver在RAM地址0x210*/
Const unsigned int MoonRiver @0x210 =100;//初始化MoonRiver为100
/*分配变量MoonRiver在FLASH地址0XFFC0*/
Const float MoonRiver @0XFFC0=32.5;//初始化MoonRiver为32.5
/*分配数组MoonRiver[3]在FLASH地址0XFF00*/
Const char MoonRiver[3] @0Xff00{0,1,2};
/*分配结构sMoonRiver在RAM地址0XFFD0*/
Typedef struct
{
Unsigned char q0;
Unsigned char iq0;
}sMoonRiver;//定义一个结构型的数据类型,取名为sMoonRiver Const sMoonRiver MoonRiver @ 0xffd0={2,500};
//声明变量MoonRiver,其数据类型为sMoonRiver 如果不需要确定地址,指向在FLASH中分配一个变量,形式为: Const [数据类型] 变量名; 举例: Const unsigned int MoOnRiver=100;

推荐阅读
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • #-*-coding:utf-8-*-print(upython与开源QGis课题研究组)#print(汉字)##创建矢量数据文件#try:fromosgeoimporto ... [详细]
author-avatar
qqqq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有