19941|34

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于STM32中IAR环境下如何包含C++头文件及中断函数问题 [复制链接]

目前Cortex M3的两种MCU主要有STM32和LM3S系列.
它们都可以在IAR环境下用C++编写程序,但略有差异.
由于Cortex M3的中断函数和其他MCU/ARM/DSP不同,它实际是一个普通函数.
它们在IAR环境下的中断向量表用C的数组表示很有特点,不像以往都是用汇编.
正因为中断函数是普通的函数,那么对于C++中类的成员函数作为普通的中断函数将会比其他容易的多.
这样C++在MCU上的编程就更合理和完美了~~~
虽然STM32在stm32f10x_vector.c中定义了中断向量表并在stm32f10x_it.c内
构造了所有的中断空函数.

再一个问题就是包含C++头文件的问题.
在LM中C++头文件<string>,<cstdlib>等可以放如一个公共头文件中大家引用.
而在STM32中这些C++头文件只能放入各自的CPP文件的头部引用,否则将编译出错!!!

为什么要用C++呢???起码string会很方便的~~~
此帖出自stm32/stm8论坛

最新回复

                                 C++是个好东西,不过不太敢用 就说string吧,支持+-=比strcpy之流方便多了 但是你如果看它的内部实现就会发现大量调用new/delete 另一个好用不敢用的就是vector 一样的原因 就连IAR自己的Help都说对于长期运行系统不建议使用C++ 因为很容易就会造成内存碎片 前阵子曾经想过ucos+重载new/delete绕过这个问题 忙。搁下了。  详情 回复 发表于 2009-11-26 18:32
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

STM32的C++类成员函数做中断函数的三个主要步骤

1.在类中声明ISP()
class SystemObj
{
public:
//................
//类成员函数做中断函数
    static void SysTickHandler(void);//必须声明为静态函数!!!
public:
    volatile unsigned int RamTest;
    union
    {
        volatile unsigned char WorkFlag;
        struct
        {
            unsigned char Watchdog:         1;//允许喂狗
            unsigned char SysTickFlag:      1;//节拍中断
            unsigned char MainLoopFlag:     1;//主循环运行
            unsigned char MainWatchdog:     1;//主循环喂狗
        };
    };
};

2.构造类成员函数
//节拍中断服务程序(类成员函数做中断函数)
//static//此处不能加static!!!
//类成员变量必须指明实际的类!!!(System.SysTickFlag 不能写成SysTickFlag )
void SystemObj::SysTickHandler(void)
{
    Keyboard.Exec();//"零耗时键盘"消抖及运行命令
    System.SysTickFlag = true;//通知主循环节拍中断正常工作
}

3.在stm32f10x_vector.c内的中断向量表内填写需要中断的类成员函数地址
const __root intvec_elem __vector_table[] =
{
  { .__ptr = __sfe( "CSTACK" ) },
  __program_start,
  NMIException,
  HardFaultException,
  MemManageException,
  BusFaultException,
  UsageFaultException,
  0, 0, 0, 0,            /* Reserved */
  SVCHandler,
  DebugMonitor,
  0,                      /* Reserved */
  PendSVC,
//  SysTickHandler,
  &SystemObj::SysTickHandler,
//不能用下列写法
//  &System.SysTickHandler,
  WWDG_IRQHandler,
  PVD_IRQHandler,
//..........................
};

注意: &SystemObj::SysTickHandler替换了原先的SysTickHandler
即饶过了stm32f10x_it.c内的空函数SysTickHandler()
用SystemObj::SysTickHandler()替代为新的节拍中断函数
此帖出自stm32/stm8论坛
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

大叔真辛苦,过年还在辛勤耕耘,赞!

                                 年礼,红裤头送上,哈哈哈~~~~~
此帖出自stm32/stm8论坛
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 

哈哈~~~正在把上次凑合改写的万利程序归整~~~

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 

大叔還那么勤.佩服

                                 新年快樂!
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 

前段时间忙活破51耽误了俺玩Cortex M3的时间,过节正好多玩~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 

折腾,继续折腾!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 

学习了

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 
MDK下能不能用C++呀?
我试了一下怎么不认识class关键字
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
其实C写到一定程度,基本就与C++没多大区别了。
好比汇编写到一定程度,也非常类似C的风格!

面向对象编程是要有良好的概念。这点就是VB,DELPHI非常成功的。
到现在的C#,JAVA之类。 而VC++虽然说是C++,但作为面向对象编程。
已经很落后与很不友好的。

至于编译器效率,这点除了怪责编译器本身外,CPU的指令系统也有很大关系的。
因为CPU是没有智慧与灵魂的机器。。。。

总落后于人类的思维方式的。。。。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 C没有C++的封装和继承,所以程序的架构是会有差别的
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
楼上你好,所有的程序都有封装和继承。

你写个SPI的驱动(类),这样你就可以在这个基础上不断的继承与发展下去,这些工作是你做的,

难道 C++的‘继承’是CPU依靠自己的“智慧”把代表继承下来的吗? 还不是微软的那帮程序员把代码都写好,
然后,你就可以使用它们忽悠的所谓C++‘继承’,当然不用写什么东西,
好比  按钮 ‘继承’了窗体的某些’特性‘代码。

所有的程序都有封装。
某些变量,函数如果不想告诉被其他外部程序调用,不对外公布入口就可以了,
好比上面说的SPI驱动(类), 只向外提供一个读,一个写,函数不就可以吗?

内部具体的SPI FLASH微代码操作,没必要告诉谁吧,也没必要向外提供吧,这不就是封装了吗?

我看楼上被人忽悠的迷迷糊糊的!
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 


我说的道理很简单,
不管像11楼说的多复杂的所谓C++封装和继承。最终都要被编译到二进制的机器代码。

也就是说,不管多复杂的高级语言编程。 使用最原始的机器码编程照样可以实现一模一样的功能。
一模一样大小与效率的代码。 是不是?

因为CPU是没有智慧与灵魂的机器。它不会升级,使用高级语言它是不会发展到使用高级的方法来理解的。
最终这个笨机器还是要把高级语言翻译为那个0/1的机器码才能理解啊!

懂吗?11楼的大道先生!
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

14
 
楼上:

C是“平面”的,而C++是“立体”的。这就是非OOP和OOP的差异。

另外C++早于MS,没有C++便没有MS。所以不是C++沾了MS的光,而是MS沾了C++的光。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
现在是面向对象, 连VC++6.0还不是真正与完全的面向对象。差的太远了。
如果没有类库(没有他人一早编写好的代码),光个C++有什么用?

甚至在 。net与JAVA没当道的年代,不远啊,就是2000年前。
使用VC++6.0的还一大片使用 WINDOWS API的呢!
我问楼上,WINDOWS API是属C还是C++,  
你知道某些API还是用汇编写的吗?

其实微软的程序员把大量的WINDOWS API 基础继承到封装起来,
就是C++各类库下面成员函数的具体实现问题啊。
有同名的类库与成员函数与API对应

其实当时使用VB,DELPHI开发的人比VC6.0++的人多的不知多了多少N倍呢,
就算是使用VC6.0++,其实是用WINDOWS API的人比类库的人也不少吧?

我想问楼上VB6,DELPHI7是C++还是面向对象?哈哈!
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼上:

不知你觉得什么地方可笑?

OOP是一种理念,而非某一语言。没弄明白这点谈C++才真有点可笑。

VB是玩具,Delphi是pascal的变种。只是当时MS尚未成熟,再加上其对basic的自恋,自然会有如此局面。MS是在其WIN95之后开始走向成熟,当时VC++5.0 + MFC便已经成为专业的软件开发平台,只是业界还未适应而已(多数是非专业开发)。谈到API,这是个广义的概念。DOS和WIN3.2的API自然不能和MFC(也是一种API)相比,MS为了遵循兼容性原则保留了原始的API界面形式,那是它的商业战略。但不能说MFC就是一个另类。若这样看的话,恰恰没有看到MS的MFC中的精髓,而这些精髓正是MS从C++中得到的。

最后要说的是,C++是一个包含OOP的语言(注意我没说它是OOP语言)。OOP只是它的子集。正因为如此,C++成了嵌入式系统语言的首选。这一点都不奇怪,如果你觉得奇怪了,那只能说明你还未真正理解嵌入式系统而且也没理解C++。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

17
 
哈哈,难得与楼上灌水~。

*。那些说VB是什么什么的人,我认为都是人云亦云的那种(计算机编程的门外汉)
*.姑且不论什么存在就是道理的那种看法,就是在.NET,.FRAME WORK ,JAVA还没投入市场时,
  PC 软件市场的编程工具销量与用量最大的是什么?  就是 VB3.0-4.0.
  曾几何时?  FOXPRO, POWER BUILDER是数据库软件开发工具的代表呢!

  BORLAND宝兰公司的TC++可谓是DOS年代的代表了,到WINDOWS 3.2 与95,
  DELPHI 1.0开始 就造就了INSPRIE从93年到2000年的辉煌时期。
  这段93-2000年,宝兰的开发工具一直领先微软的VC++.甚至VB.
  只有那些什么底层的驱动,核心控制等,还是普遍用汇编的。而不是C.这个可见一斑。
汇编版的WINDOWS API 还是多数的。到核心和底层的玩意,汇编还是首先的!  

*。MFC类库现在彻底垮掉,微软不知是有心还是无意,不断的出些标新立异的东西。
*。现在.NET FRAMEWORK 一统江湖。

其实C++在嵌入式玩,也应该是慢慢倡导的。
个人观点,没有优秀的类库,操作系统支持,和好比好的图形类库等支持。光个C++,其实与使用C
真的没多大区别。

C写到一定程度,其实也很像C++的风格。
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

18
 
C写到一定程度,其实也很像C++的风格。
看了这句自然就没必要再扯了,不是一个频段的。

闪了!
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 
VC++6.0 的 C++与MFC  可谓是 【高不成与低不就】!这句经典台词来形容

底层的核心用汇编和 C 写或写的API.

高的好比通常用的数据库,用VB, DELPHI可谓风头无量。

现在MFC 完全被自家的主子微软抛弃掉。模仿JAVA与吸收VB,DELPHI。从新出来现在的
dot net framework, 走上了真正面向对象的时代(已经不再固执的推销那个C++)
开发.NET 那个负责人就是微软从insprie挖角来的DELPHI的VCL的总设计师吧?
而其中微软的C#就是个颗新星。VC++.NET也改头换面了。

当人家都改变意识形态时 ,我们的电工还拿着那个 技术过时的C++在忽悠怎样怎样的好!
真是  “不是一个频段的。”!

计算机由于没有智慧与灵魂,就永远落后人类的思维方式。
因此 人类需要的 +-*/ 和逻辑的思维,计算机的机器指令就必须体现。
这是人类的需要!

如今人类的思维步入面向对象时代,那个过时的C++就必须被淘汰或改进。
这是人类科技不断进步的结果。不是CPU自身的需要!
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 惭愧,我还在用宝兰BCB。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表