你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于memset( )函数

[复制链接]
骆驼-350031 提问时间:2015-3-26 11:43 /
   最近使用STM32F103做一个短信机项目时,发现C 函数memset( )使用异常,在查看keil的帮助文件后,没有得到解决方法,最后自己动手写了一个,请问各位网友也没有遇到这个问题,是不是keil的ARM开发平台没有提供memset( )函数?
收藏 评论23 发布时间:2015-3-26 11:43

举报

23个回答
废鱼 回答时间:2015-3-26 14:22:44
头文件<string.h>引用了吗?
moyanming2013 回答时间:2015-3-29 17:33:00
本帖最后由 moyanming2013 于 2015-3-29 17:35 编辑
Eagleson 发表于 2015-3-28 10:40
microlib 是缺省 C 库的备选库。 它用于必须在极少量内存环境下运行的深层嵌入式应用程序。 这些应用程序 ...

我指勾不勾选microlib跟memset是否有问题基本无关。我倒认为,勾选了microlib反而会增加出问题的几率。如果代码空间够用,最好别勾选microlib。下面是使用microlib需要注意的一些问题(包括但不限于这些):
Microlib is not compliant with the ISO C library standard. Some ISO features are not supported and others have less functionality.
Microlib is not compliant with the IEEE 754 standard for binary floating-point arithmetic.
Microlib is highly optimized for small code size.
Locales are not configurable. The default C locale is the only one available.
main() must not be declared to take arguments and must not return.
Microlib provides limited support for C99 functions.
Microlib does not support C++.
Microlib does not support operating system functions.
Microlib does not support position-independent code.
Microlib does not provide mutex locks to guard against code that is not thread safe.
Microlib does not support wide characters or multibyte strings.
Microlib does not support selectable one or two region memory models as the standard library (stdlib) does. Microlib provides only the two region memory model with separate stack and heap regions.
Microlib does not support the bit-aligned memory functions _membitcpy[b|h|w][b|l]() and membitmove[b|h|w][b|l]().
Microlib can be used with either --fpmode=std or --fpmode=fast.
The level of ANSI C stdio support that is provided can be controlled with #pragma import(__use_full_stdio).
#pragma import(__use_smaller_memcpy) selects a smaller, but slower, version of memcpy().
setvbuf() and setbuf() always fail because all streams are unbuffered.
feof() and ferror() always return 0 because the error and EOF indicators are not supported.

个人认为,为了保证代码的兼容性、可扩展性、可维护性,只在代码空间实在太大且不违背上述局限性时再考虑使用microlib优化空间的问题。
moyanming2013 回答时间:2015-3-30 12:25:13
Eagleson 发表于 2015-3-30 08:17
http://www.xuebuyuan.com/1357284.html  我的理解 使用 microlib 跟优化是无关的吧

使用microlib就意味着你要优化。
优化的是代码空间,但优化也意味着损失一些东西,见microlib的一些注意事项。
你使用了相比经过优化的microlib,则意味着附带的优化了自己程序的代码空间。但这些优化是有副作用的(肯定的)。
我认为,这类优化导致了可移植性差(你写的代码在自己的IDE上行,但别人试用时不行了-除非也打开microlib)、扩展性差(因为可能要用RTOS等其它选项,导致你的代码无法添加到这类应用中)等问题。
所以STM32CubeFX中的代码是基于标准c来写的,当然也不会进行任何优化。而优化过的库,比如DSP会进行特殊说明,或者出不同版本(比如优化过的和未优化)的DSP库,以符合各类需求。
我主要是看到很多帖子上来就提勾选microlib,这会导致错误的导向!我认为应该把microlib的问题说清楚,选不选程序员自己决定!
QQ截图20150330121730.jpg
小蚂蚁快溜跑 回答时间:2015-3-26 12:22:05
不懂。。。帮顶
骆驼-350031 回答时间:2015-3-26 13:26:31
其实只是一个简单的函数,我只是求证一下试试keilARM版是不是成熟!
Mandelbrot_Set 回答时间:2015-3-26 13:30:53
参数传对了吗??
骆驼-350031 回答时间:2015-3-26 13:35:28
参数应该没问题,常用的一个函数
bit 回答时间:2015-3-26 13:57:24
没用过  库里应该有的
winterflower 回答时间:2015-3-26 13:59:10
我有用STM32F103,用到这个函数,没有任何问题
骆驼-350031 回答时间:2015-3-26 14:17:03
那我在找找原因,我想也应该没问题的
骆驼-350031 回答时间:2015-3-26 14:20:03

其实,实现起来也没啥难的!
void* memset(void* s, int c, size_t n)
{
    unsigned char* p = (unsigned char*) s;

    while (n > 0) {
    *p++ = (unsigned char) c;
    --n;
    }

    return s;
}
骆驼-350031 回答时间:2015-3-26 14:26:04
当然应用了
Eagleson 回答时间:2015-3-26 14:27:55
我自己也有用啊,没问题
Eagleson 回答时间:2015-3-26 14:28:57
软件勾选 使用 micro LIB了没
moyanming2013 回答时间:2015-3-26 14:31:03
Eagleson 发表于 2015-3-26 14:28
软件勾选 使用 micro LIB了没

microLib是最大限度的优化代码空间,但貌似处理不好有问题吧
kqh1120 回答时间:2015-3-27 00:10:36
不懂帮顶 3.gif
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版