EDN首页   博客首页

1

关于投票
将C++裸奔进行到底---为字符串添嫁衣

见原帖讨论: http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=2999130

hotpower 发表于 2008-6-14 14:17 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


楼主: 将C++裸奔进行到底---为字符串添嫁衣

在MCU/ARM/DSP中的C++一般都很简陋,特别是字符串的操作上,
但在LCD上几乎离不开字符串的处理,故盲目的"裸"确实不雅~~~

如果配备了下图的"火力",不知还有人反对菜农在MCU上"推销"C++之心了~~~

先给大家看看~~~裸---也很雅~~~

点击看大图

点击看大图

系统分类: DSP
用户分类: C++裸奔大法系列
标签: 无标签
来源: 原创
发表评论 阅读全文(284) | 回复(0)

1

关于投票
AVR之裸奔框架C++程序源码(菜农C++裸奔大法之四)

工程师的收藏夹


俺的地盘俺做主

/*------------------------------------------------------------------------
                 AVR之裸奔框架C++程序源码(菜农C++裸奔大法之四)
本程序主要表现了C++多文件系统的MCU构建方法,任何支持C++的MCU/ARM/DSP都可用
此法构建。
特别要注意变量的重复定义问题:
      最好每个C/CPP文件包含与自己同名的H头文件,在其H头文件中再包含一个中间
起桥梁作用的H头文件,我一般喜欢main.h
    变量或函数要在C/CPP中定义,绝对不要在H头文件中定义!
但一定要在H头文件中用extern加变量或函数声明。
    C++中要切记全局的类的构造函数肯定要在main()前运行,对于IAR编译器有个
__low_level_init()函数也会在main()前运行,它主要控制所有变量或类的初始化
    一般类的成员函数是不能作为中断服务程序ISR()的,但Cortex-M3确是一个意外
总之中断程序要用__interrupt修饰的ISR()的,其类成员函数不能为ISR()
    最好用一个单独的文件interrupt.cpp来编写所有中断服务程序ISR(),可能其
H头文件什么都没有也最好加上。
    每个头文件的构成结构基本如下:
#include "main.h"

#ifdef  __IAR_SYSTEMS_ICC__
#ifndef _SYSTEM_BUILD
#pragma system_include
#endif
#endif

//上面的是IAR特有的

#ifndef __M48_INTERRUPT_H
#define __M48_INTERRUPT_H

#ifdef __cplusplus
extern "C"
{
#endif

//在此添加C++代码

#ifdef __cplusplus
}
#endif

#endif//__M48_INTERRUPT_H

"桥梁"H头文件要包含所有用到的H头文件!!!否则"桥梁"倒塌~~~

菜农HotPower@126.com   2008.6.14 4:18 作于特殊的节日来奉贤给大家~~~
-------------------------------------------------------------------------*/

#include "main.h"
/*-------------------------------------------------
IAR对位的支持举例如下:
    PORTB_Bit2 = 1;//等同下句
    PORTB |= (1 << PB2);//等同上句
    PORTB = (1 << PB2) | (1 << PB1);//直接写
    PORTB_Bit2 = 1;PORTB_Bit1 = 1;//代码长度等同上句,分2次控制
    PORTB |= (1 << PB2) | (1 << PB1);//先读后写
    PORTB = (1 << PB2) | (1 << PB1) | (1 << PB0);//直接写
    __no_operation ();//IAR自带的__nop()
    _NOP();//IAR自带的__nop()
--------------------------------------------------*/

/*-----------------------------------------------
IAR的变量定位很不错举例如下:
#pragma location = 0x00
__eeprom unsigned char DataTbl0[] = {1, 2};
#pragma location = 0x10
__eeprom unsigned char DataTbl1[] = {2, 3};

__flash unsigned char DataTbl2[] @ 0x1ff = {2, 3};

__no_init unsigned char test[10] @ 0x8ff;
-----------------------------------------------*/

/*------------------------------------------
在*.XCL文件尾部加入以下3句(M48为iom48.xcl)
// Output
-Ointel-extended,(CODE)=.hex//输出hex文件
-Ointel-extended,(XDATA)=.eep//输出eep文件
-------------------------------------------*/

 

/*------------------------------------------
IAR AVR C++程序运行顺序(以本程序为例)
1. __low_level_init