打印
[开发工具]

关于STM32中IAR环境下如何包含C++头文件及中断函数问题

[复制链接]
16720|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-2-10 01:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前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会很方便的~~~
沙发
hotpower|  楼主 | 2008-2-10 04:34 | 只看该作者

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()替代为新的节拍中断函数

使用特权

评论回复
板凳
香水城| | 2008-2-10 09:54 | 只看该作者

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

年礼,红裤头送上,哈哈哈~~~~~

使用特权

评论回复
地板
hotpower|  楼主 | 2008-2-10 10:11 | 只看该作者

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

使用特权

评论回复
5
yocheng| | 2008-2-10 11:44 | 只看该作者

大叔還那么勤.佩服

新年快樂!

使用特权

评论回复
6
hotpower|  楼主 | 2008-2-10 14:03 | 只看该作者

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

使用特权

评论回复
7
老狼| | 2008-2-12 10:48 | 只看该作者

折腾,继续折腾!

使用特权

评论回复
8
nongfuxu| | 2008-2-14 13:27 | 只看该作者

学习了

使用特权

评论回复
9
fisher3014| | 2009-10-31 14:55 | 只看该作者
MDK下能不能用C++呀?
我试了一下怎么不认识class关键字

使用特权

评论回复
10
大道至简| | 2009-11-2 12:04 | 只看该作者
C没有C++的封装和继承,所以程序的架构是会有差别的

使用特权

评论回复
11
HWM| | 2009-11-2 14:37 | 只看该作者
楼上:

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

另外C++早于MS,没有C++便没有MS。所以不是C++沾了MS的光,而是MS沾了C++的光。

使用特权

评论回复
12
HWM| | 2009-11-3 08:13 | 只看该作者
楼上:

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

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++。

使用特权

评论回复
13
HWM| | 2009-11-3 09:51 | 只看该作者
C写到一定程度,其实也很像C++的风格。netjob 发表于 2009-11-3 09:42


看了这句自然就没必要再扯了,不是一个频段的。

闪了!

使用特权

评论回复
14
mcuisp| | 2009-11-3 11:04 | 只看该作者
惭愧,我还在用宝兰BCB。

使用特权

评论回复
15
大道至简| | 2009-11-3 15:11 | 只看该作者
本帖最后由 大道至简 于 2009-11-3 15:17 编辑

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

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

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

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

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

我看楼上被人忽悠的迷迷糊糊的!
--------------------
十分感谢这位仁兄的指点
我想说的是,你所说的继承是软件工程管理意义上的继承,我说的是代码的无缝直接继承。就是拿来直接可以用的。我知道C这方面也有拿来很容易使用的code,但是你要向上扩展,你多多少少是要改一点code的。而C++不一样,我根本不需要管class里面是怎样的code,直接继承调用它的public函数就ok。甚至可以生成N个同样的对象,放在一个C++容器里面。
这个最直接的例子就是,C++的数据结构类,继承完了一个数据元素,直接放在容器里面,可以动态增长删除。方便着呢。虽然C语言也能做到,但是总感觉数据和代码的打包性能不如C++的好。所以你看现在很多程序员用到的基本数据类型(如队列、栈、链表、树等),极少用C来写,都用C++了。

还有C语言里面的string操作,要用到strcpy,strcat,strcmp,memcpy等叽叽歪歪的函数,而c++只要用=来赋值,用<,>,来判断哪个字符串大哪个字符串小。用==来判断字符串是否相等。用专门的字符串类也懒得管理字符串占用的内存。总之2个字,方便。。。而C语言,在这方面做得很烂。一不留神就出个内存问题。

所以只要CPU允许,我都尽量用C++的。C语言是倾城,但是C++倾国。。。。

使用特权

评论回复
16
大道至简| | 2009-11-3 15:13 | 只看该作者
本帖最后由 大道至简 于 2009-11-3 15:21 编辑

13楼: 本帖最后由 netjob 于 2009-11-2 14:27 编辑

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

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

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

懂吗?13楼的大道先生!
----------------------------
建议13楼用汇编,在汇编的层次做好封装和继承。。。。。

使用特权

评论回复
17
大道至简| | 2009-11-3 16:38 | 只看该作者
C++的好处还是有的,起码他跑起来比java快得多。


-------------------
难到就不可以用一个封装好的C函数来实现C++那些串的所谓简单明了用法?
这个是别人写好的程序你调用,和你自己写的程序调用。

你可以去网上找开源的code,实现复杂的数据结构,用C++的居多。
------------------------
假如我在南昌,我知道,骑自行车可以到北京,火车也可以去北京,飞机也可以去北京。但是三者代表了三个不同的效率和速度。所以,存在的就是合理的。这就是C++存在的理由。。。。。

使用特权

评论回复
18
大道至简| | 2009-11-3 16:39 | 只看该作者
C++的好处还是有的,起码他跑起来比java/C# /.net快得多。

使用特权

评论回复
19
mohanwei| | 2009-11-3 18:21 | 只看该作者
对于那些所谓字符串操作方便的说法。
我看过VC的CString内部实现的源码,所谓动态添加、增长,其实就是先判断自己的buff是否满足要求,满足要求则直接操作;不满足则先delete buff,然后再new一个buff,接着操作……具体实现不过是把C封装起来罢了
至于CString str3=str1+"hello,world!";这种应用,不过是编译器帮了个大忙,让你用这样的语法写就可以产生相应的C代码罢了。
所以所谓xx思想是存在人脑中,而不是在编程语言中。各种编程语言都有自己的优点和缺点,没有什么好争论的,青菜萝卜各有所爱。

使用特权

评论回复
20
mcuisp| | 2009-11-4 00:09 | 只看该作者
我还是用0101机器码编程去、、、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝