Amp

从零开始zynq linux AXI DMA传输

南楼画角 提交于 2020-08-13 02:06:24
本文从0开始叙述过程。 使用的工具为vivado2016.4,sdk也是2016.4. 准备工作: 首先下载如下的目标文件: 1.下载xilinx官方的bootloader文件 $ git clone https://github.com/Xilinx/u-boot-xlnx.git boot_loader-generator 2.下载xilinx device tree生成工具 git clone https://github.com/Xilinx/device-tree-xlnx.git device_tree-generator 3.下载dtc编译工具 git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git dtc 4.下载linux kernel git clone https://github.com/Xilinx/linux-xlnx.git linux_kernel-sources 5.下载root file system $ git clone git://git.buildroot.net/buildroot file_system 6.拷贝用户空间AXIDMA测试程序 git clone https://github.com/bperez77/xilinx_axidma PL端 1.创建PL端工程

JAVA集合框架-线程安全( 二)[云图智联]

天涯浪子 提交于 2020-08-13 00:56:57
线程安全 - 就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。 线程不安全 - 就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。 对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制。 线程安全 工作原理: jvm中有一个main memory对象,每一个线程也有自己的working memory,一个线程对于一个变量variable进行操作的时候, 都需要在自己的working memory里创建一个copy,操作完之后再写入main memory。 当多个线程操作同一个变量variable,就可能出现不可预知的结果。 而用synchronized的关键是建立一个监控monitor,这个monitor可以是要修改的变量,也可以是其他自己认为合适的对象(方法),然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完加载load到working memory 到 use && 指派assign 到 存储store 再到 main memory的过程。才会释放它得到的锁。这样就实现了所谓的线程安全。 1、线程安全的集合对象 Vector

由微视春节集卡瓜分活动,看高可用秒杀系统的架构设计

穿精又带淫゛_ 提交于 2020-08-12 23:19:45
微视春节项目中的集卡瓜分活动,是一个典型流量洪峰下的秒杀场景,本文作者参与其中,对高可用秒杀系统的架构设计做了一些思考和总结。(流量洪峰所带来的一系列挑战,足以激发每位程序员的斗志。云加社区将推出 「高可用架构之流量洪峰」 系列内容,欢迎关注)。 一、背景简介 如今的互联网已经在海量服务领域有了很成熟的理论,有很多在流量洪峰下的实践。而微视春节项目中的集卡瓜分活动,主要环节包括发卡、集卡、瓜分等流程,涉及到高并发、降级预案等,是一个典型流量洪峰下的秒杀场景。我有幸参与其中,从0到1完整践行了海量服务。本文是对高可用秒杀系统的架构设计的一些思考,希望对读者有所帮助。 二、秒杀系统剖析 1. 秒杀系统面临的难点 (1)如何保证友好的用户体验? 用户不能接受破窗的体验,例如:系统超时、系统错误的提示,或者直接404页面。 (2)如何应对瞬时高并发流量的挑战? 木桶短板理论,整个系统的瓶颈往往都在DB,如何设计出高并发、高可用系统? 2. 如何设计秒杀系统? (1)典型的互联网业务结构 下图展示了一个典型的互联网业务结构抽象图,用户完成一个写操作,一般会通过接入层和逻辑层,这里的服务都是无状态,可以通过平行拓展去解决高并发的问题;到了DB层,必须要落到介质中,可以是磁盘/ssd/内存,如果出现key的冲突,会有一些并发控制技术,例如cas/加锁/串行排队等。 (2)直筒型架构设计

flowable 工作流 路径和节点 走过的节点描红 高亮

喜欢而已 提交于 2020-08-12 19:50:55
在正常的flowable就是显示当前节点,路径需要我们自己获取,特别是来回的驳回会导致节点混乱,这里主要就是如何正确的显示流程图 效果: 已经结束的流程 正在执行的流程 代码:1、生成图片 ​ // 源码 www.1b23.com public byte[] createImage2(String processInstanceId) { //1.获取当前的流程实例 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); String processDefinitionId = null ; List <String> activeActivityIds = null ; //2.获取所有的历史轨迹对象 List <HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId). list (); Map<String, HistoricActivityInstance>

Content-Type详解

白昼怎懂夜的黑 提交于 2020-08-12 17:01:38
一、MediaType MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型。 在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。 二、Content-Type格式 1、类型格式 type/subtype(;parameter)? type 参数 说明 type 主类型,任意的字符串,如text,如果是*号代表所有 subtype 子类型,任意的字符串,如html,如果是*号代表所有; parameter 可选,一些参数,如Accept请求头的q参数, Content-Type的 charset参数 2、常见的媒体格式类型 类型 说明 text/html HTML格式 ext/plain 纯文本格式 text/xml XML格式 image/gif gif图片格式 image/jpeg jpg图片格式 image/png png图片格式 application/xhtml+xml XHTML格式 application/xml XML数据格式 application/atom+xml Atom XML聚合格式 application/json JSON数据格式 application/pdf pdf格式 application/msword Word文档格式 application/octet

5.3c++:shared_ptr的常用操作、计数、自定义删除器等(转载)

纵饮孤独 提交于 2020-08-12 15:34:27
共享式:引用计数,每一个shared_ptr的拷贝都指向相同的内存(对象),只有最后一个指向该对象的shared_ptr指针不需要再指向该对象的时候,才会析构对象。 1.1引用计数的增加 每个shared_ptr都会记录有多少个其他的shared_ptr指向相同的对象 autop6=make_shared<int>(200);目前p6所指向的对象只有p6一个引用者 autop7(p6);智能指针定义的初始化,p7和p6指向了相同的对象,此对象目前有两个引用者 在如下情况下,所有指向这个对象的shared_ptr引用计数都会增加1: a)像上边这样,我们用p6来初始化p7这个智能指针; autop7(p6); b)把智能指针当做实参往函数里传递。 voidmyfunc(shared_ptr<int>ptmp) { return; } myfunc(p7);实参传递的时候,会复制到ptmp,会增加引用计数,出来的时候会减少1 voidmyfunc(shared_ptr<int>&ptmp) { return; } myfunc(p7);实参传递的是引用的时候,这样就不会出现引用计数的增加。 c)作为函数的返回值 shared_ptr<int>myfunc(shared_ptr<int>&ptmp) { return; } autop8=myFunc(p7); 这里有p8来接

Linux tcp/ip 源码分析

空扰寡人 提交于 2020-08-12 15:33:32
accept方法对应的内核源码为 // net/socket.c SYSCALL_DEFINE3 ( accept , int , fd , struct sockaddr __user * , upeer_sockaddr , int __user * , upeer_addrlen ) { return sys_accept4 ( fd , upeer_sockaddr , upeer_addrlen , 0 ) ; } 该方法调用了名为accept4的系统调用 // net/socket.c SYSCALL_DEFINE4 ( accept4 , int , fd , struct sockaddr __user * , upeer_sockaddr , int __user * , upeer_addrlen , int , flags ) { struct socket * sock , * newsock ; struct file * newfile ; ... sock = sockfd_lookup_light ( fd , & err , & fput_needed ) ; ... newsock = sock_alloc ( ) ; ... newsock - > type = sock - > type ; newsock - > ops = sock -

实战案例丨代码优化:如何去除context中的warning?

一个人想着一个人 提交于 2020-08-12 11:11:25
在一个java语言群里面,有人抛了这么一段代码出来,问题是出现了下下图中的warning,问有什么好的方法消除 这种强转都是因为类型链条断掉了,写入的时候擦除了类型,读出来的时候也就只能强转了,那个instanceof 其实并没有帮到什么忙,无外乎把A异常变成了B异常。 最简单的解决方法也非常直观,就是加上 @SuppressWarnings("unchecked")。 这里先不谈用其他的方法相对优雅的除掉这个warning,而是看看这段代码本身的问题。 这是一个context,这种模式就是一个数据容器,啥都能装,通过编码的人来保证类型匹配,进去擦除类型,出来补上类型,能不能弄对,全看人。 这种模式类似于在其他的语言里面就拿个容器类型就开始编程,忽略一切的type信息。 我们应当能够看到几个问题 1. context装进去的是有类型化的对象,出来就没有了,设计上讲究封装性,封装基本的就要保证对称,那么context抹除掉的东西,就应该由他来补上。 2. 由于他没有补上,所以所有使用的地方自己来补充,代码其实会产生很多冗余,考虑到他是一个context,那么实际上其他地方一定还有很多处有类似的代码 3. 这里模拟的其实是一个computeIfAbsent的逻辑,如果没有对象就补一个默认值,然后set进去,借用了isEmpty来婉转的表达容器里面没有这个元素

shell学习

偶尔善良 提交于 2020-08-12 08:54:41
一、crontab crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 -l 在标准输出上显示当前的crontab。 -r 删除当前的crontab文件。 -e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。 1、crontab文件的含义: 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:minute hour day month week command 其中: minute: 表示分钟,可以是从0到59之间的任何整数。 hour:表示小时,可以是从0到23之间的任何整数。 day:表示日期,可以是从1到31之间的任何整数。 month:表示月份,可以是从1到12之间的任何整数。 week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。 command:要执行的命令,可以是系统命令

swfit对字符的MD5处理

蓝咒 提交于 2020-08-12 08:31:07
版本swift5.0,extension我最爱 import CommonCrypto extension String { var md5:String { if let utf8 = cString(using: .utf8) { var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(utf8, CC_LONG(utf8.count - 1), &digest) let result = digest.reduce("") { $0 + String(format:"%02X", $1) } return result }else{ return self } } } 来源: oschina 链接: https://my.oschina.net/wshzj/blog/4307856