This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 将memset与msp430g2553一起使用时遇到问题

Guru**** 2540450 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/573246/facing-problem-to-use-memset-with-msp430g2553

主题中讨论的其他部件:MSP430G2553

您好,

我使用的是msp430g2553,因为我总是需要刷新缓冲区以便使用memset。但当我使用它时 ,我的程序被卷入copy_decpress_rLE.c,在这个函数中,下面的语句被写入,

"由于代码大小的原因,MSP不使用memset,而memset不使用  

适用于大型代码,小型数据模型。"

我的缓冲区大小是400字节,它是全局的。

在添加代码的某些部分之前,我可以使用memset,但在添加strstr函数之后,我遇到了这个问题。

我也尝试使用用户定义的strstr和memset,但没有得到输出。

我要在此处粘贴我的代码,

谢谢!

/******************************************************************************** /

#include<msp430g2553.h>
#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
#define size 400
#define OK "确定\r\n"
CHAR标志;
void send_wifi (void);
无符号int i1;
无符号字符I;
字符[大小];
静态无符号字符命令=1;
char *var;
void Ow_memset (void *,int,int);
CHAR* StrStr (CHAR *,CHAR *);
内部主(无效)

WDTCTL = WDTPW + WDTHOLD;//停止WDT
IF (CALBC1_1MHz=0xFF)// If calibration constant erased

while (1);//不加载,捕获CPU!!
}

P1DIR || BIT0 + BIT6;
P1OUT &=~(BIT0 + BIT6);
P1DIR = 0x01;
DCOCTL = 0;//选择最低DCOx和MODx设置
BCSCTL1 = CALC1_1MHz;//设置DCO
DCOCTL = CALDCO_1MHz;
P1SEL = BITS1 + BITS2;// WFP 1.1 = RXD,WFP 1.2 = TXD
P1SEL2 = BITS1 + BITS2;// WFP 1.1 = RXD,WFP 1.2 = TXD
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 104;// 1MHz 9600
UCA0BR1 = 0;// 1MHz 9600
UCA0MCTL = 0x02;//调制UCBRSx = 1
UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
//IE2 |= UCA0TXIE;
IE2 |= UCA0RXIE;//启用USI_A0 RX中断

__enable_interrupt ();//启用全局中断
send_wifi();
}

void UART_PUT (CHAR * CH1)

i=0;
own memset (ch,0,size);
while (*通道1)

UCA0TXBUF =*通道1++;
while (!(IFG2和UCA0TXIFG));
}
}

#pragma vector=USCIAB0RX_vector
__interrupt void USCI0RX_ISR(void)

同时(!(IFG2和UCA0RXIFG));// USI_A0 RX缓冲器就绪?
CH[I++]= UCA0RXBUF;// RX -> RXed字符
IFG2 &=~UCA0RXIFG;
IF (flag == 1)

IF (i == 150)
IE2 &=~UCA0RXIE;
}
IF (I=419)
i=0;
}

void响应(car *p)

IF(StrStrStr(cch,p)||StrStrSt(cch,"no change")||StrStrSt(cch,"link is builded")

Command++;
IF (命令== 7)

i=0;
own memset (ch,0,size);
}
}
else if (StrStr (ch,"busy"))
命令--;
else if (StrStrStr (ch,"link is not "))
命令--;
}

void send_wifi (void)

char *p,*q,b[50],c[50],i, j;

同时(1)

交换机(命令)

案例1:UART_Put ("ATE0\r\n");
Command++;
中断;
案例2:答复(确定);
中断;
案例3:UART_Put ("AT+CIPMUX=1\r\n");
Command++;
中断;
案例4:答复(确定);
中断;
案例5:UART_Put ("AT+CIPSERVER=1,80\r\n");
Command++;
中断;
案例6:答复(确定);
中断;
案例7:答复(":Get");
//po=strstrstr (ch,"+ipd");
中断;
案例8:UART_Put ("AT+CIPSEND=IPSEND\r\n" 0237);
// sprintf (buf,"AT+CIPSEND=%c,237\r\n",*(PO+5));
// UART_PUT (buf);
Command++;
中断;
判例9:response (">");
中断;
}
if(command >9)
中断;
}

__DELAY周期(100万);
命令=1;

UART_Put ("<H1>输入您的SSID和密码。</H1><form action=\"action_page.php\">SSID:<br /><input type=\"text\" name="SSID\" value="\"\"><br >密码:<br /><input type="password\" name="submit"\n""></text></text></text></text></text><\"/"></text></text></text></text></text></text><\"/<\"/<\"/></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text></text><\"/</</</</></text></text></

标志=1;

p=(char *) StrStr (ch,"SSID");
Q=(car *)StrSt(cch,"&password");

对于(i=5,j=0;(p+i)!=q;i++,j++)
b[j]=p[i];
b[j++]='\r';
b[j++]='\n';
b[j]='\0';

P=StrStr (ch,"HTTP");

对于(i=10,j=0;(q+i)!=p;i++,j++)
c[j]=q[i];
c[j++]='\r';
c[j++]='\n';
c[j]='\0';


UART_Put (c);
UART_PUT (b);

同时(1)

交换机(命令)

案例1:响应("HTTP / 1.1 ");
中断;
案例2:UART_Put (ch);
Command++;
中断;
案例3:回应("我们必须重启");
中断;
案例4:UART_Put ("AT+RST\r\n");
Command++;
中断;
个案5:回应(「准备就绪」);
中断;
默认值:Break;
}
}
}
CHAR* StrStrStr (char *str,char *substr)

同时(*str)

char *begin = str;
char *pattern = substr

//如果子字符串的第一个字符匹配,请检查整个字符串
while (*str &&*pattern &&*str ==*pattern)

STR++;
模式++;
}
//如果子字符串完全匹配,则返回起始地址
如果(!*pattern)
返回开始;

str = begin + 1;//增量主字符串
}
返回NULL;
}

void Ow_memset (void *ptr,int值,int大小)

IF (PTR!= NULL &&大小>0)

unsigned char *temp = ptr;
INT I = 0;
for (i = 0;i <大小;i++)
*temp++=(无符号字符)值;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rakesh rajbhar 说:
    ...我总是需要刷新我的缓冲区,以便使用memset。

    memset()函数不刷新任何内容。

    [报价用户="Rakesh rajbhar"]

    在该函数中,以下语句是编写的,

    "由于代码大小的原因,MSP不使用memset,而且memset不适用于大型代码,小型数据模型。"

    [/引述]

    是什么阻碍了您实现自己版本的memset()? 因此,重新编写标准库函数在嵌入式业务中并不少见。 请记住-或阅读- C语言及其库最初是为具有几乎无限内存(具有分页/交换的虚拟内存)的操作系统(Unix)设计的。

    功能真的很小,不是吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很可能是RTL strstr()函数失败。 请注意,strstr()是不安全的-没有数组边界检查。 要么始终确保strstr()的两个参数都正确终止C字符串,要么通过数组大小检查/参数实现strstr(),以便在ch[]缓冲区中搜索未终止的字符串。