精华内容
下载资源
问答
  • 嵌入式开发学习历程

    2020-07-03 21:47:18
    嵌入式底层开发为什么选择C语言? C语言的设计目标提供一种能以简易的方式编译、处理低级存储器、产生...什么是实时性,什么是硬实时,什么是软实时? 实时性可以定义为:在规定时间内系统的反应能力.一般,有实时要求

    嵌入式底层开发为什么选择C语言?

    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码,并且不需要任何运行环境支持,便能运行的编程语言,其移植性好,能够在多种不同体系结构的软件或硬件平台上运行;相对来说,C语言在高级语言当中是最贴近物理层面的语言,经过一系列的编译转换,最终它会成为0101的机械码,可以操作硬件,并且具有简介紧凑、使用灵活的语法机制.C语言具有很高的运行效率。

    什么是实时性,什么是硬实时,什么是软实时?

    实时性可以定义为:在规定时间内系统的反应能力.一般,有实时要求的应用有两个突出的特点:其中的活动时间性强,要求在一定的时刻和或一定的时间内自外部环境收集信息、再及时作出响应硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重。

    Linux和Unix之间的关系二者的关系

    "UNIX 是 Linux 的父亲"这个说法比较怡当,Linux起源于Unix。Linux 与 UNIX 有很多的共通之处。二者也有两个大的区别:
    UNIX 系统大多是与硬件配套的,也就是说,大多数 UNIX 系统如 AIX、HP-UX 等是无法安装在 x86 服务器和个人计算机上的,而 Linux 则可以运行在多种硬件平台上;
    UNIX 是商业软件,而 Linux 是开源软件,是免费、公开源代码的。

    Linux主流的发行版有哪些及特点

    Ubuntu,固定发布周期和支持期; 具有5年安全更新的长期支持变体;新手友好; 丰富的文档,官方和用户无私贡献。缺点:与Debian有一定的兼容性问题; 频繁的重大更新可能流失一些用户。Debian GNU / Linux,优点:非常稳定;卓越的质量控制;包括超过30,000个软件包;支持比任何其他Linux发行版更多的处理器体系结构缺点:保守 – 由于支持许多处理器架构,并不总是包含更新的技术;缓释周期;Mageia,优点:适合初学者;优秀的中央配置工具;支持数十种语言的开箱即用支持;可安装的Live镜像缺点:与Mandriva分开之后,缺乏声誉和资源,有人担心开发者没有能力长期维持开发软件包管理。Fedora,优点:高度创新;突出的安全功能;大量支持的软件包;严格遵守自由软件的理念;具有许多流行桌面环境的Live CD的可用性缺点:Fedora的优先级倾向于倾向于企业功能,而不是桌面可用性;openSUSE,优点:全面而直观的配置工具;大型软件包库,优秀的网站基础设施和印刷文档缺点:资源沉重的桌面设置和图形工具有时被视为“臃肿和缓慢”软件包管理。CentOS,优点:非常稳定和可靠;免费下载和使用;有7年以上的免费安全更新;缺点:缺乏最新的Linux技术;有时该项目未能履行其及时提供安全更新和新稳定版本的承诺软件包管理。

    有哪些虚拟机软件,特点是什么

    VMware Workstation,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案,可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。virtualbox,性能很高.并且是开源的,功能强大,可以在 Linux/Mac 和 Windows 主机中运行。Microsoft Virtual PC,它能让你在一台PC上同时运行多个操作系统。使用它,你不需要重新启动系统,只要点击鼠标便可以打开新的操作系统或是在操作系统之间进行切换。

    如何解决使用userdel删除用户的问题

    1.Ctrl + D退出当前登录用户,改用root用户登录
    2.使用vipw命令:root@zj-OptiPlex-9020:~# vipw
    把要删除的用户lhy所在的行删除,用 :wq 命令保存并退出vi编辑器
    3.系统会给出提示:
    您已经修改了 /etc/passwd。
    出于一致性的考虑,您可能需要修改 /etc/shadow。
    请使用命令“vipw -s”来进行这个工作。
    4.按照系统提示进行操作:root@zj-OptiPlex-9020:~# vipw -s
    同样的,把要删除的用户lhy所在的行删除,用 :wq 命令保存并退出vi编辑器

    罗列根目录中所有子目录的功能及存放的文件类型

    /bin :二进制可执行命令。
    /boot :在这个目录下存放的都是系统启动时要用到的程序。在使用lilo引导linux的时候,会用到这里的一些信息。
    /dev:。这个目录对所有的用户都十分重要。因为在这个目录中包含了所有linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序。
    /etc :etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。我们要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。
    /sbin :这个目录是用来存放系统管理员的系统管理程序。/home :如果建立一个用户,用户名是“jl”,那么在/home目录下就有一个对应的/home/jl路径,用来存放用户的主目录。
    /lib :这个目录是用来存放系统动态连接共享库的。几乎所有的应用程序都会用到这个目录下的共享库。
    /mnt :这个目录在一般情况下也是空的。可以临时将别的文件系统挂在这个目录下。
    /proc :可以在这个目录下获取系统信息。这些信息是在内存中,由系统自己产生的。
    /root :如果用户是以超级用户的身份登录的,这个就是超级用户的主目录。
    /tmp :用来存放不同程序执行时产生的临时文件。
    /usr :这是linux系统中占用硬盘空间最大的目录。

    日报表

    项目名称 苏嵌实训-嵌入式linuxC第1天
    今日进度以及任务 嵌入式开发了解,Linux开发了解,熟练掌握linux编程的常用命令,回顾并练习C编程
    本日任务完成情况 课堂问题的相关解答见上文,回顾并熟悉C语言知识,为后续编程学习作铺垫。
    本日开发中出现的问题汇总 学习嵌入式LinuxC开发的第一天,初步了解Linux编程开发的规范和步骤,目前对常用命令不够熟练。
    本日未解决的问题 解决使用userdel删除用户的问题理解不够,可能与后续学习的内容相关
    本日开发收获 了解了嵌入式开发的前景与形式,了解了Linux开发的相关编程过程和操作命令。
    展开全文
  • 什么是TargetAction?比如button继承于view,button可以通过添加点击事件来做出反应,但是view却不行,怎么让view也可以和button一样呢,这就是TargetAction的作用了

    什么是TargetAction?比如button继承于view,button可以通过添加点击事件来做出反应,但是view却不行,怎么让view也可以和button一样呢,这就是TargetAction的作用了:

    首先我们自定义一个buttonView:
    buttonView最重要的是需要两个属性:
    1.action:需要实现的方法
    2.target:谁来响应这个方法
    所以我们需要重写初始化方法,把这两个属性添加进去(我们默认是关闭ARC以便于熟悉内存管理)

    - (instancetype)initWithFrame:(CGRect)frame
                           target:(id)target
                           action:(SEL)action
    {
        self = [super initWithFrame:frame];
        if (self) {
            //  初始化时 对属性 进行赋值
            self.action = action;
            self.target = target;
    
        }return self;   
    }

    接下来就是写方法,要在点击结束是执行命令的话:(四个方法尽量写全)
    重点:让某个对象调用某个方法用哪个参数用 performSelector这个方法

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
    }
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    }
    
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        //  使用self.target对象调用action方法
        //  让一个对象去调用这个对象类里面的方法
        //  Object 可携带的参数
    
        [self.target performSelector:self.action withObject:self];
    }
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    
    }

    这样我们一个具备button点击功能的view就好了,让我们来试试让这个view在点击后改变颜色:
    1.先创建一个buttonView:
    target填self就是自己来响应后面填的buttonViewClick这个方法

    ButtonView *buttonView = [[ButtonView alloc] initWithFrame:CGRectMake(100, 100, 100, 100) target:self action:@selector(buttonViewClick:)];
    

    2.接下来写改变颜色的方法:

    - (void)buttonViewClick:(ButtonView *)buttonView{
        buttonView.backgroundColor = [UIColor colorWithRed:arc4random()%256 / 255.0 green:arc4random()%256 / 255.0 blue:arc4random()%256 / 255.0 alpha:1];
    }
    

    是不是很简单?

    展开全文
  • 一大早起来ASUS K43SM 打字时的鼠标满屏幕乱飞,无外触摸板控制失灵了,任务栏里的asus smart gesture图标也几日没见着了,不知道在折腾什么的时候弄坏的,果断去控制面板里卸载smartgesture(sg),可提升卸载不...

      一大早起来ASUS K43SM 打字时的鼠标满屏幕乱飞,无外是触摸板控制失灵了,任务栏里的asus smart gesture图标也几日没见着了,不知道是在折腾什么的时候弄坏的,果断去控制面板里卸载smartgesture(sg),可提升卸载不掉,然后右键选择修复,重启,才能卸载了。从往日备份的驱动文件夹里重新安装sg,重启后没有任何反应,触摸板还是能用,Google之说需要安装ATK热键驱动,但是必须先装ATK后装GS,简直了。。。又卸载后按顺序安装了ATK和GS,悲剧的是任务栏还是没有GS控制面板图标的身影,Google半天没找到解决办法,好在之前检测显卡的时候安装了个鲁大师(一般不喜欢安装这类全家桶的),检测了下驱动发现一个叫ELAN Input Device的触摸板驱动提示更新,那就更新试试,重启之后发现任务栏GS的图标终于现身啦,打开之在Mouse Detection选项选择好鼠标插入检测就搞定了,重启后触摸板终于不再调皮。

      一个小问题大概折腾了一个多小时,各种要求重启了七、八次,以前买本本的时候有师兄就说华硕质量不错,就说驱动很乱,自己用了这三年多,觉得并没有所言的那么麻烦,不过官网里面的技术支持、驱动下载介绍不清晰,同一型号提供对应驱动的厂家不止一家,有时候确实让人不知道该安装哪个,现在也没在官网里找到GS,都是自己网上搜来下载的。

      总结下:1. 卸载ATK和GS。2. 先安装ATK,再安装GS。3. 看触摸板驱动是否需要更新,比如ELAN Input Device。不知道这是不是正确的解决方式,反正想禁止触摸板的问题就这样解决了。win8.1用到的ATKPackage_Win8_64_VER100030,asus_smart_gesture_v2214_win 均已备份。

     

    转载于:https://www.cnblogs.com/geekpy/p/5194899.html

    展开全文
  • 作为码农,一直都觉得无论什么bug,都发现问题,分析问题,解决问题的过程,解决的问题的思路,都想方设法获得更多信息加以猜想验证,...这个问题给到我,第一反应看看什么方式录音,录音线程从audioflinger到ha

    作为码农,一直都觉得无论什么bug,都是发现问题,分析问题,解决问题的过程,解决的问题的思路,都是想方设法获得更多信息加以猜想验证,方法论拓展起来也是一门学问,我说不上来太多总结的东西,倒是最近遇到的一个bug,觉得很具有分析问题的代表性,记录下来也算有意义。

    问题是客户使用一个第三方开发的语音识别apk,使用一款usb摄像头在我们平台无法唤醒,而在对比机器上可以唤醒,而另外一款同品牌不同型号的摄像头两个平台都可以唤醒。

    这个问题给到我,第一反应看看什么方式录音,录音线程从audioflinger到hal到alsa流程是否正常,hal的数据是否正常

    dump了audiofinger的信息,发现录音的record thread运行正常,cat 声卡设备信息也正常

    那么与正常的摄像头差别在哪呢,于是拿到正常的摄像头,也同样dump audioflinger的信息,对比发现,可以正常识别的是以16000采样率1ch打开,而不能识别的摄像头是以48000采样率2ch的打开,audioflinger以什么参数打开这是设备本身支持不支持决定的

    为了证明这一点,我们看看这个摄像头是否可以使用16K和1ch的参数打开,于是我们退出apk,使用tinycap实验,果然打开失败了。那么对比机为何能识别呢,我们猜想这个apk只能识别16k的音频数据,48K的数据应用层没有做重采样,对比方案是自己做了重采样了。猜测也得到apk方反馈的证实,无奈本来apk方做的事由于对比方案做好了,那么这个活也得我们来干。

    接着在hal层实现重采样,48K转16K就用了一个非常简单的3取1的办法实现了,在hal层in_read接口里实现并添加dump发现已经成功将48k 2ch的pcm数据转成16K 1ch的pcm数据

     ret = proxy_read(&in->proxy, read_buff, num_read_buff_bytes);
        if (ret == 0) {
            if (num_device_channels != num_req_channels) {
                 //ALOGV("chans dev:%d req:%d", num_device_channels, num_req_channels);
    
                out_buff = buffer;
                /* Num Channels conversion */
                if (num_device_channels != num_req_channels) {
                    audio_format_t audio_format = in_get_format(&(in->stream.common));
                    unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
    
                    num_read_buff_bytes =
                        adjust_channels(read_buff, num_device_channels,
                                        out_buff, num_req_channels,
                                        sample_size_in_bytes, num_read_buff_bytes);
                }
    	}
       						
    	if (need_downsample) {
    		audio_format_t audio_format = in_get_format(&(in->stream.common));
    		unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
    		out_buff = read_buff;
    		num_read_buff_bytes =
    					adjust_channels(read_buff, 2,
    									out_buff, 1,
    									sample_size_in_bytes, num_read_buff_bytes);
    		num_read_buff_bytes =  downsample_48Kto16K(read_buff,buffer,num_read_buff_bytes,2);
       }

    简单的降采样如下:

    #define DIFF_SR 3
    #define SPEAKER_CHANNEL 2
    static int downsample_48Kto16K(void *input, void *output, int input_size, int sample_size) {
        int i;
        int output_frame = input_size / (sample_size * SPEAKER_CHANNEL * DIFF_SR);
    
        if (sample_size == sizeof(int16_t)) {
            int16_t *in = input;
            int16_t *out = output;
            for (i = 0; i < output_frame; i++) {
                *out++ = in[i*DIFF_SR*SPEAKER_CHANNEL];
               *out++ = in[i*DIFF_SR*SPEAKER_CHANNEL + 1];
            }
        } else if (sample_size == sizeof(int32_t)) {
            int32_t *in = input;
            int32_t *out = output;
            for (i = 0; i < output_frame; i++) {
                *out++ = in[i*DIFF_SR*SPEAKER_CHANNEL];
                *out++ = in[i*DIFF_SR*SPEAKER_CHANNEL + 1];
            }
        }
        return output_frame * sample_size * SPEAKER_CHANNEL;
    }
    
    

    在我这边调试ok后,交给客户测试反馈仍然有问题,于是让apk层hal层同时dump录音数据发现hal的pcm数据正常,apk层数据却是错的,于是询问apk方采用什么接口录得音,apk方答复采用一个第三方的开源库去录的音,然后把github的地址甩过来然我们自己去研究,都这么忙,谁有工夫去研究第三方的开源库呢。

    没有时间也不想去研究第三方开源库,也不是没法debug了,无论第三方开源库封装了什么api,到了native层仍然还是Audiorecord和Audioflinger再到hal的read以及tinyalsa的pcm_read。而Audiorecord的读数据的方法要么就是read,要么就是callback,于是在native的AudioRecord::read(void* buffer, size_t userSize, bool blocking)以及AudioRecord::processAudioBuffer内添加dump。思路是这里dump的数据没问题,那么问题就解决了。毕竟这是个生产者消费者模式,两边不统一可能造成读数据的overrun,难点是apk对我们来说是个黑盒子,不知道里面是怎么调用的用的什么参数。

    接下来就有个想法audioflinger使用什么采样率完全是hal层通知上去的,在hal层返回给audioflinger的全部是16K 和1ch的参数,那么audiofliner创建录音线程时就会以这个参数跑,而实际我们还是以48000 2ch的参数去打开声卡,这样apk来说完全不知道底下到底是什么设备,它只管接收数据就好了,按照这个思路修改,同时发现apk是以callback的形式录音,那么就在processAudioBuffer里添加dump,调试后这一层dump的数据已经正确是16k 1ch的,再运行apk,果然可以唤醒。

    最后在加个措施只针对这款摄像头去修改,通过声卡关键字来识别是否为该摄像头

    #define ALSASOUND_CARD_PATH  "/proc/asound/cards"
    #define READ_BUFFER_SIZE     (512)
    static int is_Alpha_usbcard_exists()
    {
    	FILE *mCardFile = NULL;
    
    	int ret = 0;
    
    	mCardFile = fopen(ALSASOUND_CARD_PATH, "r");
    	if (mCardFile) {
    		char tempbuffer[READ_BUFFER_SIZE];
    		ALOGD("card open success");
    		while (!feof(mCardFile)) {
    			fgets(tempbuffer, READ_BUFFER_SIZE, mCardFile);
    
    			if (strstr(tempbuffer, "Alpha Imaging Tech")) {
    				ret = 1;
    			}
    			memset((void *)tempbuffer, 0, READ_BUFFER_SIZE);
    		}
    		ALOGD("reach EOF");
    		fclose(mCardFile);
    	} else
    		ALOGE("Pcm open fail errno %d", errno);
    
        return  ret;
    }
    

     

    展开全文
  • 前段时间自学了一些struts2的一些技术,昨天想练练手,就...无论输入框填什么内容,验证总是通过不了,第一反应就是可能那个步骤出错,可能代码,或者配置,自己检查了n遍,无果。遂上网看看大神怎么说,可惜网上前篇一
  • 刚开始决定进入测试行业的时候,同学、朋友大多数给我的反应不解。问我为什么不干开发,而去从事测试,在这期间像一些“...测试没前途...”“测试工资低”“没地位”诸如此类的话听过无数遍。我相信,这也所有...
  • 作者:zycbsc 回复日期:2008-9-10 11:51:17 楼主只是脾气不太好,算是性格上有点小小的缺陷吧,但是人家有头脑,反应快,有大局观,还会逆向思维。楼主说“我不写了.你们爱怎么怎么去吧..路自己走出来的....
  • 什么要写技术博客

    2019-01-05 03:08:30
    我从2017年年底开始写博 不会轻信信息源了.... 那么当你以后再次阅读到某个非常做作的名词时,以前的第一反应是觉得自己的知识储备没有跟上po主的思维,但现在只会觉得作者在把一个简单的概念复杂化. ...
  • 人工智能-期末复习

    2020-12-29 17:39:51
    AI的发展历程AI的三大学派AI的应用AI面临的问题第二节:知识表示与处理(1)什么是逻辑表示法?(2)什么是产生式表示法?(3)什么是不确定性推理?不确定性推理的方法有哪些? 第一节:总框图 什么是人工智能(AI)?...
  • 后来发现都些错误的想法,日记能反应自己的成长历程,时间长了笔宝贵的财富,同时自己也不是什么了不得的大人物,我也没什么真正不可告人的秘密。别人看不看无所谓,我自己记录下来,理清思路,有所沉淀才关键...
  • 关于“wining attitude”

    2014-08-28 13:02:00
    好奇是好奇怎么个wining attitude到底是什么,所以我开始了搜索的历程。当然,按照惯例,一千个观众就有一千个哈姆雷特,大家似乎都有着各自的理解。但是,我的目光最后落在了“negotiation”上,是的,这是谈判策略...
  • Doclist压缩方法简介

    2013-02-15 02:27:40
    本文作者在学习doclist...这里需要强调的“所谓的改进顺序”只是作者yy出来方便理解记忆,并不反应真实的压缩方法发展历程。 1.什么是doclist? 倒排表的基本组成部分,看例子: Computer: 10,35,100,1
  • NOIP2017总结

    2018-01-01 14:17:16
    NOIP2017总结又一年OI之路,我再一次去往了那记录着我四年OI历程的考点。DAY1:考试刚开始,我以极快的速度打完vim配置,便开始看起题目。T1: 刚开始看到第一题,心中暗暗感到奇怪,以往应该D2T1的数学题,...
  • 回顾2020这一年,载入史册的一年。年初疫情带来的连锁反应,导致很多事情到现在也没有...写的废话比较多,主要包含2020秋招通信行业现状,为什么从通信转到开发,2020秋招互联网行业历程,2020秋招中印象深刻的几家公
  • 安装了jieba库之后,我们便可以把一段文本进行分词,进行词频统计。...它给出的反应是:could not find a version that satisfies the requirenr……找不到满意的版本 考虑是不是库名写错了,我这里就是把wordclo
  • 看到该题第一反应是便于记录层数的dfs,但是dfs存在缺陷,详见 “为什么不能用DFS”https://blog.csdn.net/sharemon/article/details/102857989。 如数据(1) 8 8 1 3 1 2 2 3 3 4 4 5 5 6 6 7 7 8 ...
  • 抽象的软件,世界

    2009-09-25 12:15:29
    第一阶段,做程序员,刚刚上路,对软件开发的理解就是你有一堆材料,我有一把锤子,你要椅子我就做椅子,要桌子做桌子,那个时候最擅长的听到一个需求马上在脑子里反应出该用什么技术去实现,几个类,几个页面。...
  • 大脑,科学家喜欢称之为“三磅空间”,一片未开垦的、神奇无比的处女地,人类发展历程中下一个函待开发的领域。每个人大约有140亿个脑细胞未被开发利用。今天,激烈竞争的现代社会、日新月异的现实变化要求人们...
  • 写在前面的话:此文我“研究”递归算法的整个思路历程,所以,“废话”有点多,大家自行提取重要信息哦~ 说起递归,大家第一反应,不就是方法自己调用自己,多简单的一句话,但是,当你第一次,有着有循环为什么...
  • 阿里巴巴面试感触

    2010-05-05 21:31:00
    一开始自我介绍,说了什么我自己都忘记了,大多还是在讲自己的大学历程以及感兴趣的专业方向,我说了自己不喜欢搞纵向的研究,喜欢搞横向的应用,因为看到别人用我做的东西我很有成就感。之后扯了一些技术的问题...
  • 有人跟我说,写这些文章没什么意义,这些问题你解决过,你就会有很深的印象,下次如果遇到同样的问题一定会立即反应出同样的问题。我说我写文的意义不是为了记录这些问题的解决办法,我写文意义而是去分享,我乐于...
  • 中译本序, 每当我们看到一个新的软件,第一反应:为什么又要发明一个新软件?ggplot2R世界里相对还比较年轻的一个包,在它之前,官方R已经有自己的基础图形系统(graphics包)和网格图形系统(grid包),并且...
  • 应已知道程序是一系列语句的集合,知道子程序/函数/宏是什么,知道象“If”这样的控制语句,也知道象“while”这样的循环结构。注意这些东西在大量语言里都是类似的。假如您学过一种宏语言,或者用过Perl之类的...
  • Thinking.In.Java

    2012-03-21 22:35:53
    应已知道程序是一系列语句的集合,知道子程序/函数/宏是什么,知道象“If”这样的控制语句,也知道象“while”这样的循环结构。注意这些东西在大量语言里都是类似的。假如您学过一种宏语言,或者用过Perl之类的...
  • 不能否认,以上这些情况正是我们大多数企业目前所面临的一个严峻的管理问题,然而,针对这一现象,我们又能有什么有效的办法来解决它呢?――事实,在中国的企业还没有完全意识到这一问题的严重性的,国外的ERP/...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

反应历程是什么