STM32F7移植miniLZO实现无损压缩

STM32F7移植miniLZO实现无损压缩

    • 源码移植注意事项
    • 测试程序
    • 测试结果

硬件环境:ALIENTEK 阿波罗STM32F7开发板
开发环境:keil5 -ARM

参考资源:
链接:miniLZO官网源码下载
链接:安富莱-STM32H7 miniLZO移植
链接:miniLZO无损压缩库评估

源码移植注意事项

工程中加入miniLZO源文件为
STM32F7移植miniLZO实现无损压缩_第1张图片
keil5中优化设置选项须设置禁止优化,否则压缩算法可能被优化导致无法正确运行。
STM32F7移植miniLZO实现无损压缩_第2张图片

测试程序

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "minilzo.h"
#include 


/************************************************
 ALIENTEK 阿波罗STM32F7开发板 实验3
 串口实验-HAL库函数版
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/


/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME	"V7-MiniLZO无损压缩算法移植和使用"
#define EXAMPLE_DATE	"2019-10-11"
#define DEMO_VER		"1.0"

static void PrintfLogo(void);
static void PrintfHelp(void);
static uint8_t TestMiniLZO(uint32_t _Len);


/* 定义测试用的输入输出缓冲和大小 */
#define IN_LEN      (20*1024ul)
#define OUT_LEN     (IN_LEN + IN_LEN / 16 + 64 + 3)
static unsigned char __LZO_MMODEL in  [ IN_LEN ];
static unsigned char __LZO_MMODEL out [ OUT_LEN ];

/* 压缩需要内存大小 */
#define HEAP_ALLOC(var,size) \
    lzo_align_t __LZO_MMODEL var [ ((size) + (sizeof(lzo_align_t) - 1)) / sizeof(lzo_align_t) ]

static HEAP_ALLOC(wrkmem, LZO1X_1_MEM_COMPRESS);
	
/* 定义个变量,避免警告 */
#if defined ( __CC_ARM )
__attribute__((section (".RAM_D1"))) uint8_t  InTempData[IN_LEN];
__attribute__((section (".RAM_D1"))) uint16_t TempValues1;
__attribute__((section (".RAM_D2"))) uint16_t TempValues2;
__attribute__((section (".RAM_D3"))) uint16_t TempValues3;
#endif


int main(void)
{
    u8 len;	
		u16 times=0; 
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
		uart_init(115200);		        //串口初始化
    LED_Init();                     //初始化LED
	
	
#if defined ( __CC_ARM )	
	TempValues1 = 0; /* 避免MDK警告 */  
	TempValues2 = 0;
	TempValues3 = 0;		
#endif
	
	PrintfLogo();	/* 打印例程名称和版本等信息 */
	PrintfHelp();	/* 打印操作提示 */
	
	
	/* 初始化 LZO */
	if (lzo_init() != LZO_E_OK)
	{
		printf("LZO初始化失败 \r\n");
		printf("一般是编译造成的操作,可以重新编译,并设置不做任何优化,同时使能-DLZO_DEBUG进行调试\r\n");
	}

	/* 测试数据的压缩和解压 */
	TestMiniLZO(1024*1);
	TestMiniLZO(1024*2); 
	TestMiniLZO(1024*3);
	TestMiniLZO(1024*4);  
	TestMiniLZO(1024*5);
	TestMiniLZO(1024*6);  
	TestMiniLZO(1024*7);
	TestMiniLZO(1024*8);
	TestMiniLZO(1024*9);
	TestMiniLZO(1024*10); 
	TestMiniLZO(1024*11);
	TestMiniLZO(1024*12); 
	TestMiniLZO(1024*13);
	TestMiniLZO(1024*14);  
	TestMiniLZO(1024*15);
	TestMiniLZO(1024*16);  
	TestMiniLZO(1024*17);
	TestMiniLZO(1024*18);
	TestMiniLZO(1024*19);
	TestMiniLZO(1024*20); 
	
    while(1)
    {
       if(USART_RX_STA&0x8000)
			{					   
				len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
				printf("\r\n您发送的消息为:\r\n");
				HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);	//发送接收到的数据
				while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);		//等待发送结束
				printf("\r\n\r\n");//插入换行
				USART_RX_STA=0;
			}else
			{
				times++;
				if(times%30==0)LED0_Toggle;//闪烁LED,提示系统正在运行.
				delay_ms(10);   
			}
	}
}



/*
*********************************************************************************************************
*	函 数 名: TestMiniLZO
*	功能说明: _Len 要压缩的数据量。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static uint8_t TestMiniLZO(uint32_t _Len)
{
	uint32_t i;
	int r;
	lzo_uint in_len;
	lzo_uint out_len;
	lzo_uint new_len;
	uint32_t start, end, cnt;

	if(_Len > IN_LEN)
	{
		printf("函数参数_Len超出允许的最大值%d\r\n", IN_LEN);
	}
	
	/* 准备要压缩的数据 */
	in_len = _Len;
	
	
	lzo_memset(in,0,in_len);
	
	for(i=0; i< in_len; i++)
	{
		in[i] = rand()%256;
		InTempData[i] = in[i];
	}

	printf("-----------------------------------\r\n");
	printf("-----------------------------------\r\n");
	
	/* 将in数组中的数据压缩到out数组 */
	start = SysTick->VAL;
	r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem);
	end = SysTick->VAL;
	cnt = abs(end - start)/216;
	
	if (r == LZO_E_OK)
		printf("压缩 %lu 字节为 %lu 字节,耗时%dus\r\n",
		(unsigned long) in_len, (unsigned long) out_len, cnt);
	else
	{
		printf("内部错误 - 压缩失败: %d\r\n", r);
		return 2;
	}
	
	/* 检查是否有位解压的数据 */
	if (out_len >= in_len)
	{
		printf(" 有未解压的数据 \r\n");
		return 0;
	}

	/* 将压缩后的数组out,解压到in数组 */
	start = SysTick->VAL;
	r = lzo1x_decompress(out,out_len,in,&new_len,NULL);
	end = SysTick->VAL;
	cnt = abs(end - start)/216;
	if (r == LZO_E_OK && new_len == in_len)
		printf("解压 %lu 字节为 %lu 字节,耗时%dus\r\n",
		(unsigned long) out_len, (unsigned long) in_len, cnt);
	else
	{
		printf("内部错误 - 压缩失败: %d\r\n", r);
		return 1;
	}
	
	/* 校验压缩是否成功 */
	for(i = 0; i < in_len; i++)
	{
		if(InTempData[i] != in[i])
		{
			printf("测试压缩失败\r\n");
		}
	}
	
	return 0;
}


/*
*********************************************************************************************************
*	函 数 名: PrintfHelp
*	功能说明: 打印操作提示
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfHelp(void)
{
	printf("操作提示:\r\n");
	printf("1. 数据压缩和解压测试,请下载程序并重新给板子上电,上电后自动打印\r\n");
}

/*
*********************************************************************************************************
*	函 数 名: PrintfLogo
*	功能说明: 打印例程名称和例程发布日期, 接上串口线后,打开PC机的超级终端软件可以观察结果
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
static void PrintfLogo(void)
{
	printf("*************************************************************\n\r");
	
	/* 检测CPU ID */
//	{
//		uint32_t CPU_Sn0, CPU_Sn1, CPU_Sn2;
//		
//		CPU_Sn0 = *(__IO uint32_t*)(0x1FF1E800);
//		CPU_Sn1 = *(__IO uint32_t*)(0x1FF1E800 + 4);
//		CPU_Sn2 = *(__IO uint32_t*)(0x1FF1E800 + 8);

//		printf("\r\nCPU : STM32H743XIH6, BGA240, 主频: %dMHz\r\n", SystemCoreClock / 1000000);
//		printf("UID = %08X %08X %08X\n\r", CPU_Sn2, CPU_Sn1, CPU_Sn0);
//	}

	printf("\n\r");
	printf("*************************************************************\n\r");
	printf("* 例程名称   : %s\r\n", EXAMPLE_NAME);	/* 打印例程名称 */
	printf("* 例程版本   : %s\r\n", DEMO_VER);		/* 打印例程版本 */
	printf("* 发布日期   : %s\r\n", EXAMPLE_DATE);	/* 打印例程日期 */

	/* 打印ST的HAL库版本 */
	printf("* HAL库版本  : V1.3.0 (STM32F7xx HAL Driver)\r\n");
	printf("*************************************************************\n\r");
}




测试结果

*************************************************************
* 例程名称   : V7-MiniLZO无损压缩算法移植和使用
* 例程版本   : 1.0
* 发布日期   : 2019-10-11
* HAL库版本  : V1.3.0 (STM32F7xx HAL Driver)
*************************************************************
操作提示:
1. 数据压缩和解压测试,请下载程序并重新给板子上电,上电后自动打印
-----------------------------------
-----------------------------------
压缩 1024 字节为 561 字节,耗时328us
解压 561 字节为 1024 字节,耗时9us
-----------------------------------
-----------------------------------
压缩 2048 字节为 565 字节,耗时334us
解压 565 字节为 2048 字节,耗时17us
-----------------------------------
-----------------------------------
压缩 3072 字节为 569 字节,耗时345us
解压 569 字节为 3072 字节,耗时27us
-----------------------------------
-----------------------------------
压缩 4096 字节为 573 字节,耗时357us
解压 573 字节为 4096 字节,耗时36us
-----------------------------------
-----------------------------------
压缩 5120 字节为 577 字节,耗时367us
解压 577 字节为 5120 字节,耗时46us
-----------------------------------
-----------------------------------
压缩 6144 字节为 581 字节,耗时379us
解压 581 字节为 6144 字节,耗时56us
-----------------------------------
-----------------------------------
压缩 7168 字节为 585 字节,耗时391us
解压 585 字节为 7168 字节,耗时66us
-----------------------------------
-----------------------------------
压缩 8192 字节为 589 字节,耗时596us
解压 589 字节为 8192 字节,耗时76us
-----------------------------------
-----------------------------------
压缩 9216 字节为 593 字节,耗时585us
解压 593 字节为 9216 字节,耗时86us
-----------------------------------
-----------------------------------
压缩 10240 字节为 597 字节,耗时572us
解压 597 字节为 10240 字节,耗时96us
-----------------------------------
-----------------------------------
压缩 11264 字节为 601 字节,耗时440us
解压 601 字节为 11264 字节,耗时892us
-----------------------------------
-----------------------------------
压缩 12288 字节为 605 字节,耗时548us
解压 605 字节为 12288 字节,耗时116us
-----------------------------------
-----------------------------------
压缩 13312 字节为 609 字节,耗时534us
解压 609 字节为 13312 字节,耗时128us
-----------------------------------
-----------------------------------
压缩 14336 字节为 613 字节,耗时476us
解压 613 字节为 14336 字节,耗时859us
-----------------------------------
-----------------------------------
压缩 15360 字节为 617 字节,耗时510us
解压 617 字节为 15360 字节,耗时149us
-----------------------------------
-----------------------------------
压缩 16384 字节为 621 字节,耗时501us
解压 621 字节为 16384 字节,耗时162us
-----------------------------------
-----------------------------------
压缩 17408 字节为 625 字节,耗时513us
解压 625 字节为 17408 字节,耗时173us
-----------------------------------
-----------------------------------
压缩 18432 字节为 630 字节,耗时525us
解压 630 字节为 18432 字节,耗时183us
-----------------------------------
-----------------------------------
压缩 19456 字节为 634 字节,耗时461us
解压 634 字节为 19456 字节,耗时194us
-----------------------------------
-----------------------------------
压缩 20480 字节为 638 字节,耗时550us
解压 638 字节为 20480 字节,耗时204us

STM32F7移植miniLZO实现无损压缩_第3张图片
扫码关注公众号“TechChenSir”获取更多相关分享内容

你可能感兴趣的:(STM32)