自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(120)
  • 收藏
  • 关注

原创 Android CallStack使用

代码里添加:android::CallStack stack("Debug info");Android12 亲测有效。

2024-04-30 11:01:06 44

原创 Android12之如何查看hidl服务

本篇目的:在Android源码中提供了cmd、service、dumpsys来获取Binder服务的工具,但是Android8.0以后推出HIDL服务, 前边三个工具是无法获取到的,下面我们如何获取HIDL服务呢?HIDL向hwservicemanager(/dev/hwbinder)注册binder服务。Google为我们提供了一个脚lshal的工具,下面来看下它的用法。<4>.查看HIDL服务名、线程数量和客户端梳理。<2>.service和lshal命令对比。<2>.查看系统所有HIDL服务。

2024-04-23 14:26:50 325

转载 Android ServiceManager进阶

在新版中,getService、checkService、addService、listServices四个方法和旧版在使用上基本相同,新增了一个新方法 waitForService ,这个方法会先去 getService ,如果无法获取到对应的服务,则向ServiceManager 注册一个 IServiceCallback 并开始等待,当对应的服务被add到 ServiceManager 中时,这个服务被注册的信息会通过 onRegistration 回调到当前进程,解锁等待后再getService。

2024-04-23 14:15:42 7

原创 User-defined conversion function

operator bool就是User-defined conversion function。

2024-04-07 20:33:29 205

原创 一些奇怪的函数指针转换

话不多说,自己看代码编译运行体会。

2024-02-26 15:08:09 356

原创 AIDL实践

以上三个文件写完以后就可以运行mm先处理aidl文件了。会提示你运行m android.hardware.demo-update-api来自动生成(更新)aidl/aidl_api文件夹。android.hardware.demo-service.xml:(最后要push到/vendor/etc/vintf/manifest目录下)Android.bp:(里面可能很多库是不需要的)

2024-01-29 12:04:13 421

转载 ARMV8 用户态DMA cache一致性问题和解决

原因:dma和cpu都有操作内存的能力,dma操作内存不通过cpu和cache,即cpu cache感知不到dma对内存的操作因此cpu和dma合作时,就会存在cpu cache和内存的一致性问题,原因是dma对内存操作无法被cache感知。当然如果给dma的内存是no cache的,cpu不会使用cache,也就不存在相关问题。如果给dma的是带cache内存,那么cpu访问的时候就需要注意。armv8提供了cache相关指令解决上述问题,比如下面2条:dc civac Data or un

2021-08-25 18:40:09 1545

转载 Linux C/C++调试之三:性能分析工具callgrind的使用

callgrind是valgrind工具套件中用于分析程序性能的一个工具,它能够得到粒度为函数、代码行和指令级别的性能数据,具体来说,我们可以得到某个函数、某行代码、某条指令处累计执行了多少条指令。我们看一个实例:// foo.cppint accumulate(int begin, int end){ int result = 0; for (int i = begin; i < end; i++) { result += i; }}...

2021-08-05 10:59:58 894

原创 变长数组(variable-length array)

C语言中,直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况:int n;scanf ("%d", &n);int array[n];虽然n确实是需要运行时动态确定的变量,但是在C99中,以这种变量作为数组大小的形式已经是允许的了。这样的数组就被称之为“变长数组”。注意:变长数组是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长

2021-08-05 10:10:40 1474

转载 C++的性能优化实践

内容目录:1 Gprof 2. gprof使用步骤 1.初始化大对象耗时 2.Map使用不当优化准则:1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的;在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升;这个很好理解。函数A虽然代码量大,但在一次正常执行流程中,只调用了一次。而另一个函数B代码量比A小很多,但被调用了1000次。显然,我们更应关注B的优化。2. 编完代码,再优化;编码的时候总是考虑最佳性能

2021-07-28 10:44:31 343

转载 【日常杂记】for(int i=1;i<n;i=2*i)的时间复杂度

问题:求如下代码的时间复杂度for(int i=1;i<n;i=2*i){ cout<<"Hello!"<<endl;}解:第一次循环:i=1第二次循环:i=2i=2第三次循环:i=2i=2*2=22…第k次循环(最后一次):i=2k-1最后一次决定了2k-1<n<2k,两边取2的对数,得到:k-1<log2n<k,也就是:log2n<k<log2n+1因此:这段代码执行了k次基本操作(打印字符串),即:...

2021-07-28 10:03:16 2472

转载 (数据结构)十分钟搞定时间复杂度(算法的时间复杂度)

我们假设计算机运行一行基础代码需要执行一次运算。int aFunc(void) { printf("Hello, World!\n"); // 需要执行 1 次 return 0; // 需要执行 1 次}那么上面这个方法需要执行 2 次运算int aFunc(int n) { for(int i = 0; i<n; i++) { // 需要执行 (n + 1) 次 printf("Hello,

2021-07-28 09:13:31 257

转载 计算机编码问题解析(反码,补码等)

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法.书中关于原码、反码、补码和移码的定义如下(n是机器字长):原码:反码:补码:移码:一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, .

2021-07-21 18:04:06 512

原创 vulkan tutorial

#define GLFW_INCLUDE_VULKAN#include <GLFW/glfw3.h>#include <iostream>#include <stdexcept>#include <cstdlib>#include <vector>#include <cstring>#include <optional>#include <set>const uint32_t WIDTH =.

2021-07-17 11:54:50 224

转载 什么是拓扑排序(Topological Sorting)

(文章引用于http://songlee24.github.io/2015/05/07/topological-sorting/)一、什么是拓扑排序在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有

2021-07-06 15:48:29 5341

原创 questions

GLContext: Can a process have not only one context? what's the index of the context?100 floors, two eggs.check whether the binary tree is a BSTwhat is VBO?float in the computertextureview and surfaceviewthe pipeline of opengles

2021-06-25 10:00:11 96

转载 SurfaceView及TextureView区别

1、SurfaceView是什么它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SF中对应的Layer

2021-06-25 09:51:36 5026

转载 认真分析mmap:是什么 为什么 怎么用

mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现了文件磁盘地址和进程虚拟地址的映射关系。实现映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:由上图可以看出,进程的虚拟地址空间,由多个虚拟内存区域构成。虚拟内存区域是进程的虚拟地址.

2021-06-23 10:55:29 257

原创 rvalue reference

template<class T>void swap(T& a, T& b)// "perfect swap" (almost){T tmp {static_cast<T&&>(a)}; // the initialization may write to aa = static_cast<T&&>(b);// the assignment may write to bb = static_cast<T.

2021-06-14 17:46:07 156

原创 Lvalues and Rvalues

To complement the notion of an lvalue, we have the notion of an rvalue. Roughly, rvalue means ‘‘avalue that is not an lvalue,’’ such as a temporary value (e.g., the value returned by a function).If you need to be more technical (say, because you want to

2021-06-14 17:22:08 117

原创 packaged_task & future & async

packaged_task:double accum(double∗ beg, double ∗ end, double init)// compute the sum of [beg:end) starting with the initial value init{return accumulate(beg,end,init);}double comp2(vector<double>& v){using Task_type = double(double∗,dou

2021-06-14 17:04:08 74

原创 Passing Arguments to thread function

void f(vector<double>& v);// function do something with vstruct F {// function object: do something with vvector<double>& v;F(vector<double>& vv) :v{vv} { }void operator()();// application operator ; §3.4.3};int main(

2021-06-14 17:00:42 131

原创 thread using

void f(); // functionstruct F {void operator()();}; // function object// F’s call operator (§3.4.3)void user(){thread t1 {f};thread t2 {F()};t1.join();t2.join();// f() executes in separate thread// F()() executes in separate thread// wait for

2021-06-14 16:58:17 161

转载 移动构造函数和移动赋值运算符

如果第二个对象是在复制或赋值结束后被销毁的临时对象,则调用移动构造函数和移动赋值运算符,这样的好处是避免深度复制,提高效率。为了直观地观察移动构造函数和移动赋值运算符的运行方式,编写一个类Pointer,该类的对象会在堆动态创建一个数组。代码如下:class Pointer{public: Pointer(const int i,const string &n) { mptr = new int[i]; length = i;...

2021-06-14 16:47:49 321

转载 引用返回左值及其判断引用有效性的方法

被调函数的返回类型决定返回的是左值还是右值,当被调函数的返回类型是引用时,返回的是左值,其余情况下返回的是右值,被调函数返回的左值有着与其他左值类型同样的运算特性,需要特别指出的是,我们能为返回类型是非常量引用的函数的结果赋值,但是需要注意的是,进行运算的前提是确保返回的引用是有效的,返回与局部对象绑定的引用是无效的,因为被调函数运行结束时,局部对象的存储空间已经释放,返回与局部对象绑定的引用将会产生错误的结果,要想确保返回值的安全,我们不妨自问:引用绑定的是被调函数运行前的哪一个对象?然而,在...

2021-06-14 11:21:47 324

原创 初始化列表的初始化顺序

构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序。成员被初始化的次序就是定义成员的次序。第一个被定义的成员先被初始化,依次类推。一般,初始化的顺序无关紧要,然而,如果一个成员是根据其他成员而初始化,则成员的初始化顺序是至关重要的。class x {  int i;//声明顺序是先i,后j,故初始化列表中,会先初始化i,在初始化j  int j;public:  x(inttem): j(tem),i(j){}//看起来是先初始化j,然后初始化i,其实恰恰相反,先用...

2021-06-14 10:55:40 1571

原创 how to get the size new‘ed

如果你用的是glibc的话,里面有个malloc_usable_size的函数,可以拿到malloc的大小。类似free,指针得是原始申请出来的指针,不能有偏移。#include "malloc.h"#include <iostream>void get_malloc_size(void* p) { size_t size = malloc_usable_size(p); std::cout << "malloc size is: " << size

2021-06-14 10:50:35 59

原创 thread examples in c++11, including how to pass member function to thread

// constructing threads#include <iostream> // std::cout#include <atomic> // std::atomic#include <thread> // std::thread#include <vector> // std::vectorstd::atomic<int> global_counter (0);.

2021-06-13 15:42:37 78

原创 list Initialization using {}

If an initializer is specified for an object, that initializer determines the initial value of an object.An initializer can use one of four syntactic styles:X a1 {v};X a2 = {v};X a3 = v;X a4(v);Of these, only the first can be used in every context, .

2021-06-13 15:41:07 89

原创 two ways to avoid deadlock when using mutex

// unique_lock constructor example#include <iostream> // std::cout#include <thread> // std::thread#include <mutex> // std::mutex, std::lock, std::unique_lock // std::adopt_lock, std::de.

2021-06-13 15:01:23 145

转载 Linux DRM(二)基本概念和特性

在《Linux DRM (一) Display Server》我们了解了 DRM 诞生的历史缘由。本篇我们朝着 DRM 本尊再走几步,先介绍几个 DRM 的基本概念。一、楔子上篇文章中我们有讲过 DRM 是 linux 下的图形渲染架构,用来管理显示输出、buffer 分配的。应用程序可以直接操纵 drm 的 ioctl 或者是用 framebuffer 提供的接口进行显示相关操作。后来大家觉得这样太 low 了,干脆封装成一个库吧。于是 libdrm 诞生了,它是一个库,其中提供了一系列友好的

2021-06-03 11:25:24 1427

转载 Linux 图形栈一览:基于 DRM 和 Wayland

Chen Jie创作于 2019/11/13打赏by Chen Jie of TinyLab.org 2019/10/07本文图示了基于 DRM 还有 Wayland 的 Linux 图形栈。在这个图形栈中,App 将画好的 surface,通过 Wayland 协议提交给 Compositor。Compositor 将来自各个应用的 surface(s) 合成为一帧,通过 DRM 接口最终画在 Frame Buffer,如下图所示:图 1:Linux 图形栈概览:Wayland..

2021-06-03 11:23:42 912

转载 Android 如何使用GPU硬件加速

1.名词解释GPU:Graphic Processing Unit(图形处理器)OpenGL:Open Graphic Library定义了一个跨编程语言、跨平台的编程接口的规格,不同厂商会有不同的实现方法,它主要用于三维图象(二维的亦可)绘制。SurfaceFlinger:Android中负责Surface之间叠加、混合操作的动态库Skia:Android中的2D图形库libagl:Android中通过软件方法实现的一套OpenGL动态库libhgl:为区别libagl,自定义..

2021-05-27 16:42:12 1617

原创 note on video driver

In Linux, there is two parts for the video driver, the kernel part and the X server part.Let's identify your hardware first. By typinglspci | grep VGAin a terminal, you should see a line with you graphic card description (even if not configured at all)..

2021-05-27 16:28:06 146

原创 android debugging tools introduction

This article is a summary fromhttps://source.android.com/devices/tech/debug, summarized the key points of the debugging motheds in android.1. core dump:for crash dump, please remember:It's possible for the crash dumper to attach only if nothing els..

2021-05-25 14:50:36 579

转载 __attribute__(constructor)和__attribute__(destructor)

1、前言最近看代码,看到一个函数前面用__attribute__((constructor))修饰,搜了整个程序,没发现哪个地方调用这个函数。如下:__attribute__((constructor)) void load_file(){ printf("Constructor is called.\n"); g_count = (int *)malloc(sizeof(int));}2、__attribute__介绍__attribute__可以设置函数属性(Fun...

2021-05-19 16:22:46 183

转载 内存优化总结:ptmalloc、tcmalloc和jemalloc

概述需求系统的物理内存是有限的,而对内存的需求是变化的, 程序的动态性越强,内存管理就越重要,选择合适的内存管理算法会带来明显的性能提升。比如nginx, 它在每个连接accept后会malloc一块内存,作为整个连接生命周期内的内存池。 当HTTP请求到达的时候,又会malloc一块当前请求阶段的内存池, 因此对malloc的分配速度有一定的依赖关系。(而apache的内存池是有父子关系的,请求阶段的内存池会和连接阶段的使用相同的分配器,如果连接内存池释放则请求阶段的子内存池也会自动释放)。

2021-05-19 11:28:04 276

原创 some code

mine:#include <stdio.h>void bubblesort(int in[], int len){ for(int i = 0; i < len - 1; i++) { for(int j = 0; j < len -1- i; j++) if(in[j] > in[j+1]) { ...

2021-05-06 19:04:02 109

转载 为什么类中的线程函数必须要声明静态?

其实类的静态函数就跟全局函数是一个样子的, 只是调用的时候要加下个类修饰符而已.至于为什么不能是非静态成员函数呢, 因为非静态成员函数都会在参数列表中加上一个this指针为为参数, 这样的话你写的线程函数就不符合调用规定了.比如 DWORD WINAPI ThreadFun(LPVOID); 是非静态的,实际编译后,就会变成DWORD WINAPI ThreadFun(LPVOID, CMyClass *this);这个函数就明显不能作为线程的函数了, 因为多了个参数.所以编译就过不了了...

2021-04-30 10:06:35 576

转载 GCC/G++选项 -Wl,--as-needed

GCC/G++提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,这两个选项一个是开启特性,一个是取消该特性。 在生成可执行文件的时候,通过 -lxxx 选项指定需要链接的库文件。以动态库为例,如果我们指定了一个需要链接的库,则连接器会在可执行文件的文件头中会记录下该库的信息。而后,在可执行文件运行的时候,动态加载器会读取文件头信息,并加载所有的链接库。在这个过程中,如果用户指定链接了一个毫不相关的库,则这个库在最终的可执行程序运行时也会被加载,如果类似这样...

2021-04-16 15:23:07 2527

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除