- 博客(62)
- 资源 (4)
- 收藏
- 关注
原创 scons入门
scons是一个Python写的自动化构建工具,可以用来编译代码,和make作用相似1、安装pythonsudo apt-get install python3sudo apt-get install python3-pip2、更改python软连接,将python3配置为python默认版本 cd /usr/bin sudo rm python sudo ln -s ...
2019-06-27 12:55:19 1748
原创 html页面实现文件上传
因为业务的需求,需要实现一个通过浏览器把本地文件上传到服务器的功能,因为之前没有做过,所以也是经过了一番探索才实现了这个功能,这里只介绍前端的实现,后台的接收、验证和保存就不介绍了。这个流程如下:1、读取本地文件2、建立和服务器的连接(使用AJAX)3、上传一些头信息和文件流4、等待服务器响应后,显示结果读取本地文件,在页面中点击 "浏览" 后,弹出文件选择对话框,使...
2019-05-21 17:22:30 131117 11
原创 jdbc 连接mysql异常及插入中文出现乱码
1、调用getConnection()连接数据库就会报出异常 DriverManager.getConnection(SQL_URL, SQL_USERNAME, SQL_PASSWORD);通过控制台打印看到,每次调用这个函数就会发生异常。java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is un...
2019-04-15 10:40:38 1070
原创 eclipse 启动的web服务,如何在url中不加项目名直接访问
刚开始在eclipse 开发和调试web服务器,用的是tomcat,启动服务后,在浏览器中输入:localhost:8080老是会报异常,并且也无法访问到欢迎页面,必须要加上项目名才 可以,例如localhost:8080/{project_name}因为开发的页面中的链接用的都是相对路径,并不希望加上项目名,而且访问localhost:8080 也要能到指定的页面才比较合理,放到to...
2019-03-16 14:30:17 1844
原创 freertos task创建和 queue使用简述
freertos中的task可以任务是一个线程,它是freertos系统调度的一个单位,使用xTaskCreate() 可以创建出task,函数原型如下BaseType_t xTaskCreate(TaskFunction_t pxTaskCode, const char *const pcName, ...
2019-02-15 10:29:43 2927
原创 alsa amixer 使用介绍
alsa-utils 提供的工具中,arecord 可以用来录音,aplay 可以用来播放,amixer 可以用来控制音量、增益等。/ # amixer controlsnumid=34,iface=MIXER,name='Master Switch'numid=35,iface=MIXER,name='Master Switch X'numid=32,iface=MIXER,name...
2019-01-30 11:27:11 4211
原创 linux 实现监听热插拔事件
在一些跑linux 系统的平台上,比如故事机,会支持sdcard 热插拔的功能,也就是在sdcard 插入后,把sdcard mount到文件系统中,sdcard拔出后移除。上层应用要怎么知道这个事件呢,应用层可以注册监听uevent 事件即可,下面给出对应的实现。#include <stdio.h>#include <string.h>#include &l...
2019-01-29 16:47:37 3249 2
原创 openssl 实现https 网页访问
下面是一个用openssl 实现获取https 网页内容的demo,整个流程比较简单,主要封装的API如下static int https_init(https_context_t *context,const char* url);static int https_uninit(https_context_t *context);static int https_read(https_...
2019-01-20 18:47:35 5533 1
原创 socket实现下载http资源
使用socket 的api 来实现下载http 网络资源,其实整个流程也十分简单1、解析url 得到域名 和 资源位置2、根据域名得到服务器ip地址,然后通过ip 和端口建立socket连接3、发送http 请求4、解析http 响应5、根据返回的响应内容,等到资源的大小,接收资源数据,保存到文件即可 需要引用到的头文件和一些常量的定义#include <s...
2018-12-23 13:21:12 2614
原创 looper线程的简单实现
在代码的逻辑中,我们经常需要把一些操作放到一个线程中去执行,比如android 中的更新UI就只能在main线程中执行,这样做是为了避免有些资源被两个(多个)线程“同时”修改。下面是用c语言实现的looper线程。#ifndef __MESSAGE_LOOPER_H__#define __MESSAGE_LOOPER_H__#include <pthread.h>#d...
2018-11-24 20:25:22 1081
原创 cmake入门
CMake是一个跨平台的编译工具,可以用简单的语句来描述个平台的编译过程。使用cmake 来编译代码十分简单,方便,cmake是一个生成编译脚本的工具,在linux 它会生成对应的makefile文件,然后调用makefile来编译代码。1、编译一个简单的打印hello world程序main.c的内容很简单,就是打印hello world#include <stdio.h...
2018-07-31 22:33:23 515
原创 使用alsa-lib实现录音
虽然网上已经有了很多的参考资料,但是不是很详细,而且注释也很少。有些看起来似懂非懂,所以在我这里提供了一版详细的实现代码,方便大家一起学习。头文件的声明在 alsa_record.h#ifndef COM_HXIONG_ALSA_RECORD_H#define COM_HXIONG_ALSA_RECORD_H//宏定义#define RECORD_FAIL -1#define REC...
2018-06-05 15:30:45 6763 1
原创 使用arecord、aplay 实现录音和播放
1、arecord 录音1)查看录音设备输入 adb shell输入arecord –lC:\Users\Administrator>adb shell/ # arecord -l**** List of CAPTURE Hardware Devices ****card 0: xxsndcard [xx-snd-card], device 1: TDM_Capture (*) []...
2018-06-05 10:28:03 53717 4
原创 大文件分割工具,QT实现
最近在学习QT开发,为了验证自己学习成果,最好还是做一个有点用的UI界面工具。想到了在前一家公司工作时,主要是分析出系统发生的异常,找出根本原因。这个异常可能发生在linux kernel,也可能是native 层的应用,也可能发生在apk中。特别是烧机和压力测试过程中发生的异常,通常会抓很多的log来辅助分析,这些log抓出来后会是一个好几G的大文件,利用文本工具打开来查看log,几G的文件基本...
2018-05-19 12:06:28 4201 1
原创 QT修改应用图标,给按钮添加监听器
1、QT怎么修改应用图标将图标文件放到工程下面,例如qwind_icon.ico然后在项目中点击右键,选择添加新文件在新建文件对话框中选择Qt->Qt Resource File 在弹出的Qt Resource File对话框中的名称一栏输入xxx.rc ,然后继续下一步编辑新建的xxx.rc文件,添加IDI_ICON1ICONDISCARDABLE"qwind_icon.ico",后面的x...
2018-04-23 23:44:58 1986
原创 QT安装简介
1、下载QT安装包下载网址:http://download.qt.io/或者http://download.qt.io/archive/qt/选择一个你需要的版本,例如 5.10点击进去后,选择对应操作系统的安装包下载,例如qt-opensource-windows-x86-5.10.0.exe2、安装QT安装包下载好后,双击运行,根据提示一步步往下走即可在选择要安装的组件时,可能需要注意了,可以...
2018-04-22 10:59:00 118595 8
原创 memblock 数据结构及API介绍
前面一篇博客介绍了memblock初始化的流程,实际上并没有介绍完整,只是列出了大概的流程,设计到的相关数据结构都没有介绍,所以接下里继续了解memblock使用到的数据结构,以及是如何进行内存分配和管理的。linux-4.10/include/linux/memblock.h47 struct memblock {48 bool bottom_up; /* is bottom up d...
2018-03-12 21:21:22 1073
原创 memblock 初始化简介
在linux kernel初始化完成之后,系统中的内存分配和回收是由伙伴系统来管理,但是在kernel 初始化阶段时内存的分配和释放是由memblock管理,memblock在系统启动阶段进行简单的内存管理,记录物理内存的使用情况。本篇博客主要介绍在系统启动阶段memblock 的初始化过程。linux-4.10/init/main.c482 asmlinkage __visible void ...
2018-03-01 23:47:55 2434 2
原创 device tree 简介
1、什么是设备树(device tree)它是一种描述硬件资源的数据结构,可以通过bootloader将它传给内核,内核(driver)使用它对硬件进行初始化,好处是使得内核和硬件资源描述相对独立,不需要太多的硬编码。2、设备树的相关名词1)DTS(device tree source).dts文件是一种ASCII文本对Device Tree的描述,位于linux-4.10//arch/arm64...
2018-02-27 22:59:14 3123
原创 freertos 编码风格
1、FreeRTOS简介百度百科介绍,FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等。2、变量命名风格FreeRTOS的核心源代码遵从MISRA编码标准指南。1)uint32_t类型的变量使用前缀ul,这里’u’表示’unsigned’,’l’表示’long’
2018-01-28 16:26:33 674
原创 android condition 详细介绍
上一篇介绍了Mutex 的作用和实现,在多线程中,使用mutex 可以实现对全局变量的加锁保护,也就是在访问(读写)这个变量之前先要获取对应的锁,然后才能访问。在多线中还有这样的场景,某个线程需要等另外一个线程完成了某些操作,然后再“通知”这个线程往下执行,这就需要使用到condition,下面给出具体的实例。frameworks/av/include/media/stagefright/fo
2017-12-27 22:26:14 5546
原创 android mutex 详细介绍
一个进程中不可能只有一个线程在战斗,所以一个进程中一般都是有多个线程的同时协助工作,多线程情况下,对于一些全局变量,也就是多个线程能够同时访问的变量,我们需要通过加锁来防止“同时”访问这个变量,Mutex 就是我们常用的一个。frameworks/av/include/camera/CameraBase.h113 Mutex
2017-12-24 21:01:26 7040
原创 linux 进程调度切换过程分析
从系统调用或者异常中断返回用户空间时,thread_flags 被设置成TIF_NEED_RESCHED 会发生调度,当然还有其他几个时机也会发生调度,这里主要介绍中断返回用户空间时的情况。linux-4.10/arch/arm64/kernel/entry.S744 ret_fast_syscall:745 disable_irq // disable interrup
2017-12-23 19:13:47 3334
原创 linux sched init简介
调度器的初始化,前面的android 开机流程讲过,uboot(bootloader)执行完一些初始化动作后,会将kernel加载到内存,然后跳到kernel。kernel在执行完一段汇编代码,准备好c的运行环境后,跳到 start_kernel()。linux-4.10/init/main.clinux-4.10/init/main.c482 asmlinkage __visib
2017-12-23 15:07:22 2288
原创 android 抓取crash信息流程简介
通过上一篇博客我们知道,在linker 完成自身重定位,在对可执行程序进行重定位的过程中,会初始化debuggerd,也就是注册异常处理函数,在程序发生异常的时候抓取异常信息。4185 /*4186 * This code is called after the linker has linked itself and4187 * fixed it's own GOT. It i
2017-12-17 14:02:38 2307
原创 android linker 执行流程
通过前一篇的博客,我们知道,在linux kernel加载完可执行程序后,在需要解释器的情况下,返回用户空间时会先跳到解释器的函数中执行,对于android平台而已,就是先跑到_start()函数,然后再跳转到__linker_init()。bionic/linker/linker.cppextern "C" ElfW(Addr) __linker_init(void* raw_args)
2017-12-12 21:33:03 3952
原创 linux elf加载过程
通过前面linux 进程的创建和加载我们知道,调用ececve()系统调用后会加载指定的可执行程序并且运行起来,接下来我们分析这个加载过程,跑到do_execve()函数中。linux-4.10/fs/exec.cint do_execve(struct filename *filename,1806 const char __user *const __user *__argv
2017-12-03 21:50:44 2637
原创 ELF 文件格式介绍
ELF文件是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。1、文件结构视图2、elf重定义的数据类型在linux-4.10/include/uapi/linux/elf
2017-11-24 22:18:14 998
原创 art heap创建流程
通过前面的博客我们知道在art 创建的时候,会创建出heap实例,也就是管理art 的堆的对象。art/runtime/runtime.cc932 bool Runtime::Init(RuntimeArgumentMap&& runtime_options_in) {...1015 heap_ = new gc::Heap(runtime_options.GetOrDef
2017-11-19 21:09:37 996
原创 android runtime 创建流程
在zygote进程启动过程中会创建art虚拟机,那我们就看一下art虚拟机是怎么创建出来的。用户空间的init进程起来之后,会根据.xxxrc 文件中的配置,把相关进程运行起来,通过fork()和execve()来创建和加载对应的进程,我们锁熟悉的zygote进程也是在这个时候被运行起来的,zygote进程的前身是app_process,到了后面才把这个进程的名字改成zygote,可执行程序为
2017-11-12 21:53:00 3432
原创 linux 进程的创建和加载
我们还是一cameraserver进程为例,看它是如何被系统加载运行起来的。frameworks/av/camera/cameraserver/cameraserver.rc1 service cameraserver /system/bin/cameraserver2 class main3 user cameraserver4 group audio
2017-10-22 22:12:40 2074
原创 linux 进程和线程简介
1、进程的概念进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。2、轻量级进程轻量级进程由clone()系统调用创建,参数是CLONE_VM,即与父进程是共享进程地址空间和系统资源。轻量级进程有自己独立的用户空间栈和内核空间栈,并且可以被linux操作系统像普通进程一样被调度。
2017-10-11 20:44:47 593
原创 android build system
1、gcc编译参数详解1)-E指示编译器对输入文件进行预处理,并将结果输出到标准输出(控制台)。预处理包括头文件的包含、宏定义的扩展、条件编译的选择等。2)-D和-U-D在命令行定义宏,作用等同于在代码中进程宏定义;-U用于取消宏定义。例如–DDEBUG=1 #define DEBUG 1#include int main(){ printf("hell
2017-10-10 22:06:37 412
原创 linux kernel 简介
linux kernel construction overviewlinux kernel 大致分为上图五大部分。1、进程管理 负责进程的创建和销毁,进程的调度。
2017-09-26 22:19:21 4585
原创 android 开机流程详细分析
arm平台开机的时候,会先跑ic内部的rom code,rom code把flash上的uboot加载到dram中,然后执行uboot。不同的ic厂商uboot实现可能不一样,有些厂商会把uboot拆分为两个部分,第一部分会先加载到ic内部的sram运行起来,然后初始化dram,再把第二部分加载到dram中运行起来。这里我们不再深入探讨,我们只分析common的部分,uboot在跳转到kernel
2017-09-23 21:56:42 1688
原创 android 关机流程详细分析
前面的博客有提到过android事件上报流程,InputReaderThread 从EventHub读到按键事件后,交给InputDispatcher 往上上报,我们从这里跟踪一下长按power键关键流程,frameworks/native/services/inputflinger/InputDispatcher.cppvoid InputDispatcher::notifyKey(co
2017-09-22 21:54:15 6954 1
原创 Opengrok服务搭建
OpenGrok是一个快速,便于使用的源码搜索引擎与对照引擎,在android源代码中搜索一些关键信息,如果使用这个引擎,会十分方便,下面就介绍如何搭建这样一个服务。1、下载jdk下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html点击Java Platform (JDK) 下载
2017-09-13 22:13:14 751
原创 ndk addr2line工具的使用
addr2line是一个十分有用的debug工具,这个工具在ndk的安装目录下就有在ndk \toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin目录下可以用于帮助我们分析jni 里面的bug,下面我们故意在jni代码中留一个异常,在运行到memcpy就会发生空指针异常,应用会闪退。
2017-09-08 23:17:43 7596
原创 gcc 如何编译so 和 objdump 反汇编
1、打开cygwin 终端2、切换到源码所在目录3、通过gcc编译输入:gcc test.c -fPIC -shared -o libtest.so-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),编译之后生成了 libtest.so4.使用objdum
2017-09-04 22:54:30 14439
原创 Multimedia Alooper 机制分析
android 底层的录制和播放都会用到ALooper,AHandler和AMessage,这个和上一篇讲的looper有什么不一样呢?其实作用是差不多的,只是实现的方式不一样而已。1、looper线程的创建status_t ALooper::start( bool runOnCallingThread, bool canCallJava, int32_t priorit
2017-08-27 22:44:58 659
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人