7247|12

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

###心血来潮,17KB的代码压缩为7KB的代码! [复制链接]

使用STM32 20K RAM调试, 很容易出差。代码18KB,

从新建个IAR工程,删减修改。。。

总于把这个18KB的测试代码 缩小到 7KB !! 

这给使用RAM来 做 初期程序测试 打下良好基础!

此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2008-9-26 13:56
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

图:

                                  
此帖出自stm32/stm8论坛
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

你太牛了~~~~~~~

                                 哈哈
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 

再压一压

                                 7k -> 3k
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 

可以!

那就是 只有 初始化的代码。

用定时器中断点亮一个LED 灯闪烁!,ADC 转换,串口DMA,

初始化的外设: USART,ADC,RTC,BAK,PWR,GPIO,RCC,


裁剪了 USB,LCD,SPI,I2C.  和 STM32库!!!

此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 

图:

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(中级)

7
 

怎么查看代码大小?

使用IAR我还是新手,如何查看代码大小呢?
安装网上教程设置了工程选项,编译后看不到大小,还需要进行什么设置呢?
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 

LZ的库的一些问题

LZ的库ms只是重新封装了STM32的寄存器
在封装寄存器的基础上,可以考虑封装功能。
封装功能的好处:移植性超强,代码可读性超强。
个人不喜欢代码中出现需要查手册才能了解的数据,比如STM32_Scb_Regs->AIRC.all = ((u32)0x05FA0000 | ((u32)0x500);

芯片用的时间越长,应该越能"忘记"寄存器,我以前是AVR的技术支持,但现在基本上任何一个AVR的寄存器都记不住,但用AVR开发的话,我的速度绝对一流。因为不需要记任何的寄存器,需要的时候,可以马上方便的使用。
随便截取一小段我用的库:
#define ADC_Start()    setbit(ADCSRA,ADSC)
#define ADC_IsRdy()    bit_is_set(ADCSRA,ADIF)
#define ADC_WaitRdy()    loop_until_bit_is_clear(ADCSRA,ADSC)

#define ADC_SetINTEnable()    setbit(ADCSRA,ADIE)
#define ADC_SetINTDisable()    clearbit(ADCSRA,ADIE)
#define ADC_IsINTEnable()    bit_is_set(ADCSRA,ADIE)
#define ADC_ClearINTFlag()    setbit(ADCSRA,ADIF)

#define ADC_SetCLK(CLK)    RegSetRgn(ADCSRA,ADC_CLK_MSK,(CLK))
#define ADC_GetCLK()    RegGetRgn(ADCSRA,ADC_CLK_MSK)

#define ADC_GetVal16()    (ADC)
#define ADC_GetVal16_H()    (ADCH)
#define ADC_GetVal16_L()    (ADCL)
#define ADC_GetVal8()    (ADCH)

类似STM32库中的configure方式,我也早就这么用了:
/******************* GPIO **********************/
#define GPIO_HAS_PORTA        0
#define GPIO_HAS_PORTB        1
#define GPIO_HAS_PORTC        1
#define GPIO_HAS_PORTD        1
#define GPIO_HAS_PORTE        0
#define GPIO_HAS_PORTF        0

应用程序提供给别人看的时候,甚至不需要注释,代码既是注释。


另外,现在MCU的开发已经有一种趋势了。
就是开发者不需要花费太多精力在底层的寄存器上,而是通过库来封装这些底层操作,开发者只需要专注于他所需要专注的应用开发就可以了。

to LS: Tools --> Operations... --> Messages --> Show build messages --> All
此帖出自stm32/stm8论坛
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

9
 

在我的代码中,.c文件中不出现任何寄存器。

截取一段JTAG操作的底层函数:
RAMFUNC uint16 JTAG_TAP_HS_Operate(uint16 tdi, uint16 tms)
{
    JTAG_TAP_HS_Out(tms, tdi);

    JTAG_TAP_HS_WaitRxReady();

    return JTAG_TAP_HS_In();
}

RAMFUNC uint16 JTAG_TAP_HS_Operate_Asyn(uint16 tdi, uint16 tms)
{
    uint16 tdo;

    JTAG_TAP_HS_WaitRxReady();
    tdo = JTAG_TAP_HS_In();

    JTAG_TAP_HS_Out(tms, tdi);

    return tdo;
}

RAMFUNC void JTAG_TAP_HS_RW(uint8 *tdo, uint8 *tdi, uint8 tms_before, uint8 tms_after0, uint8 tms_after1, uint16 dat_byte_len)
{
    uint8 tdo_tmp;
    uint16 ret_len = 0, cur_pos = 0;

    if(dat_byte_len & 0x8000)
    {
        JTAG_TAP_HS_Operate_Asyn(tdi[cur_pos++], tms_before);
        ret_len++;
        dat_byte_len &= 0x7FFF;
        dat_byte_len--;
    }

    JTAG_TAP_DR_IR_PREPARE_DLY();
    dat_byte_len--;
    while(dat_byte_len-- > 0)
    {
        tdo_tmp = JTAG_TAP_HS_Operate_Asyn(tdi[cur_pos++], 0);
        if(ret_len > 0)
        {
            tdo[ret_len - 1] = tdo_tmp;
        }
        ret_len++;
    }
    tdo_tmp = JTAG_TAP_HS_Operate_Asyn(tdi[cur_pos], tms_after0);
    if(ret_len > 0)
    {
        tdo[ret_len - 1] = tdo_tmp;
    }
    tdo_tmp = JTAG_TAP_HS_Operate_Asyn(0, tms_after1);
    tdo[ret_len] = tdo_tmp;
}

其中,很多都是宏定义,在app_cfg.h中:
#define JTAG_TAP_HS_SPI_M            SPI2
#define JTAG_TAP_HS_SPI_S            SPI1
#define JTAG_TAP_HS_MPORT            GPIOB
#define JTAG_TAP_HS_MPINS            (GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
#define JTAG_TAP_HS_SPORT            GPIOB
#define JTAG_TAP_HS_SPINS            (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5)

#define JTAG_TAP_HS_PortInit()        do{
                                        GPIO_Dir(JTAG_TAP_HS_MPORT, GPIO_Mode_AF_PP, JTAG_TAP_HS_MPINS);
                                        GPIO_Dir(JTAG_TAP_HS_SPORT, GPIO_Mode_AF_PP, JTAG_TAP_HS_SPINS);
                                    }while(0)
#define JTAG_TAP_HS_PortFini()        do{
                                        GPIO_Dir(JTAG_TAP_HS_MPORT, GPIO_Mode_IN_FLOATING, JTAG_TAP_HS_MPINS);
                                        GPIO_Dir(JTAG_TAP_HS_SPORT, GPIO_Mode_IN_FLOATING, JTAG_TAP_HS_SPINS);
                                    }while(0)

#define JTAG_TAP_HS_SetSpeed(speed)    SPI_Configuration(JTAG_TAP_HS_SPI_M,SPI_Mode_Master,speed,
                                                SPI_FirstBit_LSB,SPI_CPOL_High,SPI_CPHA_2Edge)

#define JTAG_TAP_HS_Out(tms, tdi)    do{JTAG_TAP_HS_SPI_S->DR = tms;JTAG_TAP_HS_SPI_M->DR = tdi;}while(0)
#define JTAG_TAP_HS_In()            JTAG_TAP_HS_SPI_M->DR

#define JTAG_TAP_HS_WaitTxReady()    while(JTAG_TAP_HS_SPI_M->SR & SPI_I2S_FLAG_TXE)
#define JTAG_TAP_HS_WaitRxReady()    while(!(JTAG_TAP_HS_SPI_M->SR & SPI_I2S_FLAG_RXNE))
#define JTAG_TAP_HS_WaitReady()        while(JTAG_TAP_HS_SPI_M->SR & SPI_I2S_FLAG_BSY)

这种方式,代码移植非常简单,既是不同平台。
我以前的AVRminiProg,最近移植到另外2个别人自己做的硬件上,修改的只是app_cfg.h中的宏而已。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 

Simon把应用和底层分得很好

Application
    |
  Driver
    |
   BSP
    |
 Hardware
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 

记得 N十 多年前,MOTOROLA就为嵌入式搞C++了!


请问楼上各为现在做嵌入式,是用C++?吗?

如果是用WINCE,哪就应该算是了。

.NET:VB,VC,C#;DELPHI偶都沾边, 那种面向对象,类库的高效确实一流的。

但是:总有点底层的东东,内核的东东,总要用得汇编、二进制。。。。

就算现在DSP 也用C++开发,但是那些核心算法还是用汇编。。。

现在的STM32库 跟真正面向对象概念的 STM32 C++ 类库编程 还差一大节距离。
当然了,到时侯,哪个类库是要【钱】的了!

此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 

C++只有在wxWidgets下使用

其他的东西,包括驱动,CLI界面应用程序,Firmware都只使用C语言
N十多年前?要不还没有生下来,要不还在路边玩泥巴呢
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 

顶一下...

                                  
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表