加载中
中山野鬼 2017/07/30 20:41 回答了问题: 召集小伙伴创业啦

浇点冷水。。。这项目技术放一边不谈,有需求吗?需求能响应吗?哈。

@黑狗
做一个类似于 dashboard.motion.ai 这样的东西公司在深圳南山前期用传统方法做一个“假”人工智能前...

做广告就算了。还用个小白的例子来做广告。哈。 建议看看人工智能的发展史。

@全部原谅
摘要:燕山大学信息科学与技术专业出身的95后大学生谭创创,没想到自己会与阿尔茨海默症(俗称“老年痴呆症”)为“敌”...

纯机械的被copy,还真麻烦。如果你带自控的东西,尝试机械与自控的拟合设计,简单说一些结构件的功能有自控的算法特性。这样,机械上的纯copy,他们不抄你自控的代码,挺难工作的。抄你代码就好说点了。设备通信时预埋一个命令,自动会传回出你们公司的信息。这样法庭上跑都跑不掉。哈。

@xiaoxiaosafe
江湖告急,我公司是做工业机械的,被copy了,怎么做更有效呢?
中山野鬼 2017/07/30 03:13 回答了问题: 100w电话号码去重。

自己做个类似的堆排序也不是太难的事情。哈。如上面一些网友说,100w也不是很大的数据量,用一些工具,也化不了什么时间,自己写代码也是脑袋坏掉的选择。哈。 当然如果你要支持更多数据量就需要一些特殊设计了。

@zchlwj
有一个需求,需要将100w电话号码找出重复的部分。电话号码不规则(国际号码、分机等)目前尝试过的手段有 1. ha...
中山野鬼 2017/07/26 03:42 回答了问题: c++ 指针强制转换问题

引用来自“MStarLight”的评论

统一回复下 确实是内存对齐的问题!

因为是使用esp8266硬件开发,官方文档http://www.espressif.com/zh-hans/support/explore/faq中提到

操作指针有什么需要注意的?

内存必须 4 字节对齐读取,指针做转换时间请确保为 4 字节对齐,否则转换失败,不能正常使用。例如,请勿直接指针转换 float temp = *((float*)data);而是使用 os_memcpy (memcpy) 实现。

@changnet  @AbbyCin @中山野鬼 @AutoPlus @wei2011 @鸿鹄之心

没啥子要注意的。哈。 你记得所有都是有位宽的。数据只有(这个太绝对的,不过大多数情况下适用)定点和浮点之分。定点这里,位宽8,16,24,32,64长,都要注意。 出现 24位是有可能的,对于小规模mcu。总线宽度24位适用,这样降低片子的规模,可以省成本。只要你的设计严谨,就是用32位整型来计算24位的地址,也没道理会(24位)溢出,除非你对内存分布的控制有问题。

float temp = *((float*)data);

这个不适用比较正常。可以说也是芯片厂家偷懒,其实完全可以在编译器里面对这个新增一个基础函数嘛,但保守策略,你得把所有芯片厂家在编译器方面的工作按照偷懒模式来看待,原则上不要使用特定硬件厂家提供的特殊性工具,另可从汇编层面优化,否则移植起来更容易出潜在问题。哈。

哈,展开说一下,10多年前我觉得刻意把一个soc的总线从32位调整回24位是抠门到家的事情,而如今我认为是务实有效也体现开发团队技术能力的高水平设计。系统规模不是越大越好,而是适用、经济才是最优,系统越小,水平相同下,系统稳定性越高。动不动买公版ip,不做架构调增优化,凑凑就说自己出了款牛比soc的,那都是凑出来的“明星团队”,要么应付政府投入,要么骗投资人的钱。哈。

反过来说,pc上的cpu ,只是一种soc(目前也可以这么说吧,毕竟intel把不少东西做到cpu里了),以后如物联网或机器人领域,嵌入式的开发内容会很多(同时这两个领域我真心不认为intel有啥作为,简单说玩嵌入式,你可以忽视intel的任何方案,无论它号称某个片子多牛逼,这是企业文化导致的,arm足够你玩)。哈。 捯饬嵌入式,始终会有前途,无非别折腾android,否则你在浪费前途。哈。基于其上做软件开发,不算嵌入式开发,是另外一个方面的工作,当然也有前途。

@yysf
void callback(char* topic, uint8_t* payload, unsigned int...

哈,你说到点子上了。培训机构还真有错。。。。。

@sdfj_dw
培训机构出来的学员的简历都有哪些特征?可以直接看出就是培训机构出来的?求给点经验
中山野鬼 2017/07/25 00:46 回答了问题: c++ 指针强制转换问题

楼主 , @AbbyCin 说的没错。  两种方式,第一个是通过编译器开关(有的编译器是有这个的,将各种数据强制对齐),另一种是保守做法,对所有要用的空间,要么定义时,就通过类型的位宽保证自动对齐例如 ,long long int 等64位对齐。 要么就是动态分配是用如下方法包一层.

void * my_malloc32(uint32_t len){
    void *re = 0 ;
    uint8_t *p ;
    re = malloc(len + 4);
    p = (uint8_t *)re;
    p = ((p + 4 ) >> 2) << 2);
    p--;
    *p = uint8_t (p - re);
   re = p+1;
   return re;

}

void my_free32(void *p){
   uint8_t *p8 = (uint8_t*)p;
   p8--;
   p = p8 - *p8;
   free(p);
}

以上是随手写的。不过我的基础库代码里是有这些玩意的。这个是保证32位对齐。防止代码在移植到其他平台时,因为编译器开关没有打开导致潜在的错误发生。

@yysf
void callback(char* topic, uint8_t* payload, unsigned int...
中山野鬼 2017/07/25 00:35 回答了问题: 我没技术问题,只是想找个女朋友

所谓做好,谈不上比马克斯强,至少要比贾布斯强。都这地步了,还没妹子,只能说你取向有问题。哈。

@蒙塔基的钢蛋儿
92逗比猴子,目前在深圳,新能源汽车行业,半个程序猿,半个硬件狗。内心沉稳缜密,现到了谈婚论嫁的年龄,想找一位三观...

哈,第三个问题,应该是 , “abc"是一个常量字符串 。而你的函数定义,是个指针。这个类型确实有差异。

你上面的问题基本都是类型的问题。类型的问题,有时无所谓,但有时很致命,特别是移植到其他平台上。

我说个典型的例子,如果你的 _strcmp(char *pa ,char *pb) 下面有这样的代码:

 *pb = 0;

 这个是没有问题的。至少编译器认为是没有问题。而当你传入 “abc"这种常量字符串,实际的指针指向的地方是不能修改的,运行到这里,程序就会崩溃。这就是有问题的。

你没出问题,仅仅是因为你恰巧没对pb指向的空间内进行修改内容。但编译器认为还是“提醒你一下”更妥当。

类型错误,通常是warning,这类wanring,原则上需要全部去除。否则以后坑死你自己。。。哈。

关于int,在有些“cpu"的指令集里,一切皆int 。无非只有位宽差异。落到不同指令时,才有“类型概念”。原则上,int的位宽和指针地址的位宽一致时,那么你上面的warning 通常不会出大问题。但当他们位宽不一致时,要么不死,要么死的很难看。哈。

补充说一句,不排除编译器有自身错误。但基本和中头彩的概率一样。不严谨的说法,如果出错了,请千万不要怀疑c语言的编译器,可以说,编译器质量最高的计算机编程语言就是c语言。哈。

最后吐槽一句,这是哪个傻叉的翻译,形参,实参。 教科书中有些中文翻译从一开始源头就不准确,例如“变量,形参”,但其实没关系,说清楚就可以。不过落到具体工具还这么表述,就有问题了。曾经看过一个c语言标准的的中文版,估计是几个博士/硕士参与的翻译,反正看了后就心想,这帮子人写过几年c代码?

@b159218752
#include <stdio.h>int _strcmp(char *s1, char *s2) {for (;...

哈。这是啥版本哦。。。是不是你下载错了。

@flink58
安装c++的时候,它说没有网络,这是逗我吗

@红薯  这种一问一答的新广告形式,你不收点过路费,就太纵容啦。哈。

@容器爱好者
有在搞AI吗?

哈,不管是否被认为客观,我且“客观”的说一句,这个楼主也没什么需要反省的呀。 只是说“以。。经历,不符合”。 比如有个高大上的人,去面一个低初小的岗位,也同样会说这句话。这句话算是比较职业化的表述了。而且没有合作可能,第一时间告诉对方,是最负责的方式,总比拖很长时间的好。

@倚楼听风雨_
前提: 1、我是一直从事java开发工作6年多,4月份有自己用as写过半个月的安卓app,不说已经入门,但是一些安...
中山野鬼 2017/07/11 22:17 评论了动弹:
@蓝水晶飞机 这样可以的呀,关键代码要没错。哈。
@蓝水晶飞机
@中山野鬼 ,腻腻的问下大神,C51单片机有没有支持两个串口接口呢,想做串口通讯、单片机串口互联(消息路由功能、节省连线)
回复 @你要坚强 : 你听谁说的?哈。建议去一些芯片设计公司看看,看看里面是否有用c干活的。顺带问下年薪。哈。
@你要坚强
#include <stdio.h>void dui(int A[]);void cuo(void);void p...
中山野鬼 2017/07/01 00:28 回答了问题: 中年危机

哈,这个赞同。。。

@colin_z
背景:编程7年,从初级-中级-高级,最近换工作高不成:在成熟、大型公司面试时,往往相对毕业生或工作1-2年者,要求...
中山野鬼 2017/06/27 00:57 回答了问题: C语言函数不能传递动态内存?

哈,上面的2的解释没有错。 不知道你的问题在哪。大体运行的顺序可以看作这样的。我们假设 ,r1,r2 是寄存器,且是用于传递参数的,  test函数里的 str 是个有自己存储空间的数据(其实通常也是在寄存器里),那么在调用 GetMemory(str);时,会有如下动作,此处我用一些伪汇编来说明:

xor r1,r1 ; 让r1里面装0 ,异或自己,这个不清楚我只能说回去重修大学课程。

st [str] ,r1 ; 把 r1的0,存储到str这个空间里。

ldr r1,[str] ; 这个意思是  从 str的这个数据空间里,把数据读取出来,存储到r1 这个寄存器,通常优化编译这步骤都省略了。毕竟你不是 static str = null;此处为了说明问题,假设str这样定义是具有自己存储空间的。

call GetMemory ; 调用GetMemory这个函数。

下面就跑到 GetMemory的函数里了,然后会这么干,注意此时 GetMemory(char *p)的p对应存储在r1里,你问我为什么是这个寄存器,回答很简单,我定的规矩。每个编译器都定义这些规矩(函数的参数,存储在什么寄存器里)。

push r1 ; 把 从 str这个数据空间里读取的数据(此时存放在 r1寄存器) 保留一下,因为这个r1 马上要用于在调用malloc 函数

mov r1 ,100 ; 往 r1 寄存器里写100 这个值。当然也有变态的玩法是, xor r1,r1 ; 这是清零, add r1,100 加上100。反正就是这个寄存器的值成了100 ,

call malloc; 调用这个函数,此时,分配的空间地址会被 malloc回传,就是c代码中函数 return 的内容,我们假设是放在 r0中。

pop r1 ; 将 GetMemory(char *p) 这里的p 恢复内容。

mov r1,r0; 这个的意思对应 p = malloc(100); 这句话的左边部分, p = ...; ,此时把原先的数据洗掉了。(当然优化编译时,会发现,push r1 ,pop r1是shit的工作,毫无疑义,则会去掉这两个语句,等于说  GetMemory(char *p) 中p没有任何有价值信息被 GetMemory中的某个步骤利用。

然后return ; 了。此处指的是 c代码。

有可能会保守处理

xor r0,r0 ; 因为没有return 值,此时把r0清空。

落回 test ,则对应的汇编会去忙 strcpy这个函数的参数传递工作。那么会怎么忙呢?当然如下:

ldr r1 [str]; 从 str这个空间中读取数据,装到r1中。此时是null, 你初始化赋值的嘛。

ldr r2 , xxoo; 这个xxoo是个地址,指向常量字符串存储的区域。

call strcpy; 调用这个函数。

后面的我就不说了。上面这些汇编是随手写的。但原理不会边。 那么问题来了,你在 GetMemory里面调用malloc返回的空间地址,为啥没有存储到 Test函数里所存在的 str这个空间中呢?你问我,我也想问你。哈。

所以我挺烦一个“非专业”词汇,变量。 明明是数据空间,非要说变量。。。。。

后面补充一句,良好的编译器,应该对 GetMemory 这个函数直接优化掉。不能单从存在操作既要实现的角度,毕竟 GetMemory里面确实会有调用,但这个是个断头函数(对外部调用函数无任何价值),就是编译了,链接也不应该链接,简单说, GetMemory(str);不会体现在可执行代码中。真正出错的原因不是这里,而是 strcpy(str ,...)这里,尝试向0地址空间复制内容。

 

@jarvispipi
voidGetMemory(char *p){ p = (char *)malloc(100);}void Tes...
中山野鬼 2017/06/26 01:50 回答了问题: 嵌入式需要学习那些?

哈,这个帖子我可以说说观点。

1、c确实是绕不过去的。 汇编这个,能碰到的机会不多,除非你有特定优化。我看了看我的代码库,貌似也就这些,

static void nop_func(void){
    uint8_t i;
    for (i = 0 ; i  < 128 ;i++){
        asm volatile("nop"::);
        asm volatile("nop"::);
        asm volatile("nop"::);
        asm volatile("nop"::);

    }
}

还不是标准汇编。

2、啥是嵌入式,不就是软件和硬件的高度耦合嘛。因此通常用在驱动等底层开发或mcu这种最终做成专用设备之上。即便是嵌入式系统,如果是上的linux,然后基于linux之上做应用开发,也不能叫做嵌入式。你动linux 内核或驱动,当然算。所以计算机组成原理或其他能描述计算运行机理的书确实要看,这是基础。

3、例子和器材。通常开发板,杜邦线,面包板(如果你需要堆外围原理电路),是跑不掉的。当然如果开发板很专业,各种你需要的接口它都想到了(对项目任务而言),则也不需要啥线,更不用碰焊接。

额外补充一点,如果你是业余学着玩,那么arduino或其他与其兼容的器材和教材你可以参考和学习,反正玩玩嘛,动动手,挺开心,蛮好。但如果你是要专业的忙,听我一句劝,不要折腾arduino。客观说,arduino是一群纯软件思维的人写的代码,你学的越多,离真正嵌入式系统设计越远。哈,信不信随你。一般创客和stem教育的圈子这些话我是不说的。简单说,arduino的代码架构无法构造有点规模的嵌入式系统,为啥我就不分析了。

 

@芷云
刚进入这个行业,不知道如何系统性的学习嵌入式开发,以及要学习那些基础。顿时感到迷茫。

没有更多内容

加载失败,请刷新页面

返回顶部
顶部