打印
[STM8]

初学,从点亮LED灯开始

[复制链接]
1554|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
noeyes277|  楼主 | 2015-3-9 00:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
偶完全是个新手,十年前学过C,觉得STM8挺好玩的,就在某宝上淘了一个最小系统,这两天摸了一下,把LED点着了,挺有成就感的,以后就混这里了,大家不要嫌弃我呀。

我把程序试着改了一下,改成C++形式的,各位大师指点一下,这样用行不?只是在坛子里很少人用C++,不合适?我看MAP文件的输出,CODE并不大
//led.h
#ifndef  _LED_H
#define  _LED_H

#include "stm8s.h"

class LED
{
  public:
    LED(GPIO_TypeDef *, uint8_t);
    void ON();
    void OFF();
    void ON_OFF();
  private:
    GPIO_TypeDef *m_gpio;
    uint8_t m_bit;
};

#endif

//led.cpp
#include "led.h"

LED::LED(GPIO_TypeDef * a, uint8_t b)
{
  m_gpio = a;
  m_bit = b;
  SetBit(m_gpio->DDR, m_bit);
  SetBit(m_gpio->CR1, m_bit);  // 推挽输出
}

void LED::ON()
{
  SetBit(m_gpio->ODR, m_bit);
}
   
void LED::OFF()
{
  ClrBit(m_gpio->ODR, m_bit);
}
   
void LED::ON_OFF()
{
  ChgBit(m_gpio->ODR, m_bit);
}
   

// main.cpp
#include "led.h"
#include "stm8s.h"

void delay_ms(unsigned int ms)
{
       unsigned char i;
       while(ms!=0)
       {
              for(i=0;i<250;i++)
              {nop();}
              for(i=0;i<75;i++)
              {}
              ms--;
       }
}

void main()
{
  LED Red_led(GPIOB, 5); // 生成一个红色LED对象,接在PB5
  
while (TRUE)
{
   delay_ms(500);
   Red_led.ON_OFF();
}
}

沙发
FAQ| | 2015-3-9 01:05 | 只看该作者
早点睡觉

使用特权

评论回复
板凳
airwill| | 2015-3-9 07:55 | 只看该作者
嗯, 来支持一下. 这个 C++ 写得很规范.
网上有人说 C++ 的不好, 所有的类成员函数会多个指针(this), 浪费资源, 每一个类初始化就要占用数据堆空间, 分配占用一大堆内存. 浪费内存!
看MAP文件的输出,CODE并不大, 不知道比 C 大了多少, 可否比较一下, 看看多了多少累赘?

使用特权

评论回复
地板
noeyes277|  楼主 | 2015-3-9 10:10 | 只看该作者
谢谢支持,我觉得采用C++,用好C++的类的封装特性就够了,不要用太多的高级特性,象这样 LED Blue_led(GPIOA, 3); 就可以"做"出别一个设备,
语言本身要考虑实际的应用,这里之所以不用 new LED(),我认为,一个电路确定以后,它的设备就是固定的,并不需要动态new出来,debug版本大
概有250字节吧,晚上回去认真对比一下实际的code变化。

使用特权

评论回复
5
mmuuss586| | 2015-3-9 12:08 | 只看该作者

学STM32也可以;

使用特权

评论回复
6
白开水key| | 2015-3-9 12:20 | 只看该作者
为什么不用库呢?

使用特权

评论回复
7
noeyes277|  楼主 | 2015-3-9 19:56 | 只看该作者
这里贴一下C与C++编译后的Code大小差异
C的版本
[1] = D:\stm8s\excises\LED2\Project\Debug\Obj
[2] = command line
[3] = dbgstm8smd.a
[4] = dlstm8smn.a

  224 bytes of readonly  code memory
  128 bytes of readonly  data memory
  268 bytes of readwrite data memory

[1] = D:\stm8s\excises\LED2\Project\Release\Obj
[2] = command line
[3] = dbgstm8smn.a
[4] = dlstm8smn.a

  169 bytes of readonly  code memory
  128 bytes of readonly  data memory
  268 bytes of readwrite data memory

C++版本

[1] = D:\stm8s\excises\LED3\Project\Debug\Obj
[2] = command line
[3] = dbgstm8smd.a
[4] = dlstm8smn.a

  253 bytes of readonly  code memory
  128 bytes of readonly  data memory
  524 bytes of readwrite data memory

[1] = D:\stm8s\excises\LED3\Project\Release\Obj
[2] = command line
[3] = dbgstm8smn.a
[4] = dlstm8smn.a

  181 bytes of readonly  code memory
  128 bytes of readonly  data memory
  268 bytes of readwrite data memory

可见c++ release版本的空间只增加12字节,分析是一个对象,两个成员变量占用的空间,但c++的风格优美多了。
下一步,我打算继续封装其他的功能

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
dirtwillfly + 2 很给力!
8
manwjh| | 2015-3-9 20:08 | 只看该作者
c就挺好了

使用特权

评论回复
9
dirtwillfly| | 2015-3-9 21:01 | 只看该作者
noeyes277 发表于 2015-3-9 19:56
这里贴一下C与C++编译后的Code大小差异
C的版本
[1] = D:\stm8s\excises\LED2\Project\Debug\Obj

不错不错

使用特权

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

本版积分规则

2

主题

17

帖子

1

粉丝