硬件环境:ALIENTEK 阿波罗STM32F7开发板
开发环境:keil5 -ARM
参考资源:
链接:miniLZO官网源码下载
链接:安富莱-STM32H7 miniLZO移植
链接:miniLZO无损压缩库评估
工程中加入miniLZO源文件为
keil5中优化设置选项须设置禁止优化,否则压缩算法可能被优化导致无法正确运行。
#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