很奇怪,用之前的在C语言中跑通,在STM32中容易坏死,出现丢内存的情况,具体问题标记,回头在分析,反正是跑不通。在STM32中debug中发现了死机。
这时候看见了一个全新版本,使用mallac,在C语言中跑通了,但是malloc在STM32中不能使用,想一想也是郁闷,例子代码如下:
#include <STDIO.H>
#include <STRING.H>
#include <STDLIB.H>
int main()
{
char str1[]={"0:/"}; //文件头名,最后汇总在这里,给的空间大一些
char str2[] = "abcdefg";
char str3[]={".txt"};//文件尾名
char *pstr = NULL;
pstr = (char*)malloc(strlen(str1) + (strlen(str2)) + (strlen(str3))+1);
strcpy(pstr, str1);
strcpy((pstr + strlen(str1)), str2);
strcpy(pstr+strlen(str1)+strlen(str2),str3);
//strcpy((pstr + strlen(str1))), str2);
printf("%s",pstr);
//printf("%s",pstr);
return 0;
}
由于对stm32 malloc内存使用不熟悉,再次进行调试,使用这个代码,感觉也还不错,在C语言中跑通了,是正确的。STM32不会死机,但是数据不对,其中字符串2重复了了两遍,不知道为啥。debug发现了这个问题。
C语言跑通的版本如下,三字节合并。
#include <stdio.h>
#include <stdlib.h>
void contact(char *str, const char *str1, const char *str2);
char str1[]={"0:/"}; //文件头名,最后汇总在这里,给的空间大一些
char str2[] = "abcdefg";
char str3[]={".txt"};//文件尾名
char str[];
int main()
{
contact(str, str1, str2);
contact(str,str,str3);
printf("%s\n",str);
return 0;
}
/**
* Description:字符串连接函数
*/
void contact(char *str, const char *str1, const char *str2)
{
int i, j;
for(i = 0; str1[i] != '\0'; i ++)
{
str[i] = str1[i];
}
for(j = 0; str2[j] != '\0'; j ++)
{
str[i + j] = str2[j];
}
str[i + j] = '\0';
}
通过debug,对字符格式硬调,最后得到的格式如下。定时器6的代码如下:
#include "timer6.h"
#include "led.h"
#include "malloc.h"
#include "sdio_sdcard.h"
#include "w25qxx.h"
#include "ff.h"
#include "exfuns.h"
#include <string.h>
#include <stdio.h>
#include "rtc.h"
#include <STDIO.H>
#include <STRING.H>
#include <STDLIB.H>
extern FIL fil;
extern FRESULT res;
extern UINT bww;
extern BYTE buffer;
extern char str_Time[25];
extern _calendar_obj calendar;//时钟结构体
void contact(char *str, const char *str1, const char *str2,const char *str3);
char str1[3]="0:/"; //文件头名,最后汇总在这里,给的空间大一些
char str2[11] = "abcdefg";
char str3[10]=".txt";//文件尾名
char str[30];
//通用定时器6中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM6_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//查查定时器1,2,3,4,5,6,7
//RCC_APB1PeriphClockCmd,含有定时器2,3,4,5,6,7
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能 6
//定时器TIM6初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM6中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM6, ENABLE); //使能TIMx
}
//定时器6中断服务程序
void TIM6_IRQHandler(void) //TIM1中断
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM1更新中断发生与否
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update ); //清除TIMx更新中断标志
sprintf(str2,"%2d-%2d-%2d",calendar.w_year,calendar.w_month,calendar.w_date);
contact(str, str1, str2,str3);
//if(calendar.sec == 45)
{
res=f_open (&fil,str,FA_OPEN_ALWAYS|FA_WRITE);//FA_CREATE_ALWAYS,固定文件名
//res=f_open (&fil,pstr,FA_OPEN_ALWAYS|FA_WRITE);
sprintf(str_Time,"%4d-%2d-%2d %2d:%2d:%2d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
f_lseek (&fil,f_size (&fil)); //文件对象的读写指针移动到文件结束处
f_write(&fil,str_Time,sizeof(str_Time)-1,&bww);
f_close(&fil);
}
}
}
/**
* Description:字符串连接函数
*/
//此段代码有问题,我觉得很奇怪,就这样吧
void contact(char *str, const char *str1, const char *str2,const char *str3)
{
int i, j,k;
for(i = 0; str1[i] != '\0'; i ++)
{
str[i] = str1[i];
}
for(k = 0; str3[k] != '\0'; k ++)
{
str[i + k] = str3[k];
}
// for(k = 0; str3[k] != '\0'; k ++)
// {
// str[i + j + k] = str3[k];
// }
str[i + j + k] = '\0';
}