宝马cas编程编死了怎么样补救
涉及车型:E60、E65、E66 F01 F18
一、故障现象:
1、在编程过程中CAS 死机,造成点火开关不能接通电源唤醒其它模块。此时,无法再次对车辆编程。只能更换CAS,重新编程。
2、在正常使用过成中,点火开关不能打开,车辆无法启动。
二、解决办法:
1、对于E60 将CAS 控制单元的1 脚KL 30G、8 脚KL 15、19 脚15wup 人为连接12V 电源,然后对车辆进行编程。
2、对于E65 E66 将CAS 控制单元的48 脚15wup、49 脚KL15 人为连接12V 电源,然后对车辆进行编程,
3、对于新E70 E71 将CAS 的1 号7 号8 号14 号19 号脚人为连接12V 电源,然后把OBD-II的1号脚(空)和16号脚对接。
4、对于OBD-II 有1 号脚线的老款车辆只需要短接1 号和16 号脚就可以编程通过以上方法对CAS 编程)(新款车的CAS 和FRM 还有老款车的LM 还有3 系仪表里面有车辆数据的模块不要使用二手,如果一定要用二手零件号务必使用相等且车架号务必手工修改后对车辆才可以进行编程和设码工作))
三、原因分析:
1、此故障主要原因是由于在对CAS 编程过程中,数据传递受到干扰或由于线路等原因使数据传递失败,造成CAS 内部程序混乱,不能依照一些指令正常工作。由于在编程时数据传输是从D-BUS 到中央网关通过中央网关编译后传送到CAS,但中央网关是由CAS 通过15wup 或K-CAN唤醒,如果CAS 功能异常后,将无发唤醒中央网关,也就是说SSS无法通过D-BUS连接到中央网关也无法再对车载模块进行编程。此时,只有依照以上方法人为唤醒中央网关,然后对CAS 单独进行编程。
2、在正常使用过程中,CAS 损坏车辆无法启动。其出现该故障的原因大多是由于车辆上的电器设备在工作时,一些感性元件(如点火线圈)本身性能或相关线路不良产生了干扰源,主要由电源干扰或空间干扰的方式串入CAS,使CAS 程序错乱,造成车辆无法启动。一般通过
以上方法可以恢复功能,但也有出现CAS硬件损坏的现象,这时,必须更换CAS。
CAS号是什么意思 CAS号(CAS Registry Number或称CAS Number, CAS Rn, CAS ),又称CAS编号,CAS登录号或CAS登记号码,是某种物质(化合物、高分子材料、生物序列(Biological sequences)、混合物或合金)的唯一的数字识别号码。
CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。
特点
1、开源的企业级单点登录解决方案。
2、CAS Server 为需要独立部署的 Web 应用。
3、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等语言编写的各种web应用。
4、CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)。
在命令行输入命令ddptype,然后回车,弹出对话框,可以选择喜欢的点符号,也可以设置点号的大小,点击确定。
美国化学会的下设组织化学文摘社(ChemicalAbstractsService,简称CAS)。该社负责为每一种出现在文献中的物质分配一个CAS编号,这是为了避免化学物质有多种名称的麻烦,使数据库的检索更为方便。其缩写CAS在生物化学上便成为物质唯一识别码的代称,相当于每一种化学物质都拥有了自己的“学号。如今的化学数据库普遍都可以用CAS编号检索。CAS编号CAS编号(CASRegistryNumber或称CASNumber,CASRn,CAS#),又称CAS登录号或CAS登记号码,是某种物质(化合物、高分子材料、生物序列(Biologicalsequences)、混合物或合金)的唯一的数字识别号码。
public class CASDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(666)
// 获取真实值,并替换为相应的值
boolean b = atomicInteger.compareAndSet(666, 2019)
System.out.println(b)// true
boolean b1 = atomicInteger.compareAndSet(666, 2020)
System.out.println(b1)// false
atomicInteger.getAndIncrement()
}
}
CAS 底层原理?谈谈对 UnSafe 的理解?
getAndIncrement()
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1)
}
引出一个问题:UnSafe 类是什么?
UnSafe 类
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L
// setup to use Unsafe.compareAndSwapInt for updates
private static final Unsafe unsafe = Unsafe.getUnsafe()
private static final long valueOffset
static {
try {
// 获取下面 value 的地址偏移量
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"))
} catch (Exception ex) { throw new Error(ex)}
}
private volatile int value
// ...
}
Unsafe 是 CAS 的核心类,由于 Java 方法无法直接访问底层系统,而需要通过本地(native)方法来访问, Unsafe 类相当一个后门,基于该类可以直接操作特定内存的数据。Unsafe 类存在于 sun.misc 包中,其内部方法操作可以像 C 指针一样直接操作内存,因为 Java 中 CAS 操作执行依赖于 Unsafe 类。
变量 vauleOffset,表示该变量值在内存中的偏移量,因为 Unsafe 就是根据内存偏移量来获取数据的。
变量 value 用 volatile 修饰,保证了多线程之间的内存可见性。
CAS 是什么
CAS 的全称 Compare-And-Swap,它是一条 CPU 并发。
它的功能是判断内存某一个位置的值是否为预期,如果是则更改这个值,这个过程就是原子的。
CAS 并发原体现在 JAVA 语言中就是 sun.misc.Unsafe 类中的各个方法。调用 UnSafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。这是一种完全依赖硬件的功能,通过它实现了原子操作。由于 CAS 是一种系统源语,源语属于操作系统用语范畴,是由若干条指令组成,用于完成某一个功能的过程,并且原语的执行必须是连续的,在执行的过程中不允许被中断,也就是说 CAS 是一条原子指令,不会造成所谓的数据不一致的问题。
分析一下 getAndAddInt 这个方法
// unsafe.getAndAddInt
public final int getAndAddInt(Object obj, long valueOffset, long expected, int val) {
int temp
do {
temp = this.getIntVolatile(obj, valueOffset) // 获取快照值
} while (!this.compareAndSwap(obj, valueOffset, temp, temp + val)) // 如果此时 temp 没有被修改,就能退出循环,否则重新获取
return temp
}
CAS 的缺点?
循环时间长开销很大
如果 CAS 失败,会一直尝试,如果 CAS 长时间一直不成功,可能会给 CPU 带来很大的开销(比如线程数很多,每次比较都是失败,就会一直循环),所以希望是线程数比较小的场景。
只能保证一个共享变量的原子操作
对于多个共享变量操作时,循环 CAS 就无法保证操作的原子性。
引出 ABA 问题
原子类 AtomicInteger 的 ABA 问题谈一谈?原子更新引用知道吗?
原子引用
public class AtomicReferenceDemo {
public static void main(String[] args) {
User cuzz = new User("cuzz", 18)
User faker = new User("faker", 20)
AtomicReference<User>atomicReference = new AtomicReference<>()
atomicReference.set(cuzz)
System.out.println(atomicReference.compareAndSet(cuzz, faker))// true
System.out.println(atomicReference.get())// User(userName=faker, age=20)
}
}
ABA 问题是怎么产生的
public class ABADemo {
private static AtomicReference<Integer>atomicReference = new AtomicReference<>(100)
public static void main(String[] args) {
new Thread(() ->{
atomicReference.compareAndSet(100, 101)
atomicReference.compareAndSet(101, 100)
}).start()
new Thread(() ->{
// 保证上面线程先执行
try {
Thread.sleep(1000)
} catch (InterruptedException e) {
e.printStackTrace()
}
atomicReference.compareAndSet(100, 2019)
System.out.println(atomicReference.get())// 2019
}).start()
}
}
当有一个值从 A 改为 B 又改为 A,这就是 ABA 问题。
时间戳原子引用
package com.cuzz.thread
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.atomic.AtomicStampedReference
public class ABADemo2 {
private static AtomicStampedReference<Integer>atomicStampedReference = new AtomicStampedReference<>(100, 1)
public static void main(String[] args) {
new Thread(() ->{
int stamp = atomicStampedReference.getStamp()
System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp)
try {
Thread.sleep(1000)
} catch (InterruptedException e) {
e.printStackTrace()
}
atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 )
atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(), atomicStampedReference.getStamp() + 1 )
}).start()
new Thread(() ->{
int stamp = atomicStampedReference.getStamp()
System.out.println(Thread.currentThread().getName() + " 的版本号为:" + stamp)
try {
Thread.sleep(3000)
} catch (InterruptedException e) {
e.printStackTrace()
}
boolean b = atomicStampedReference.compareAndSet(100, 2019, stamp, stamp + 1)
System.out.println(b)// false
System.out.println(atomicStampedReference.getReference())// 100
}).start()
}
}
我们先保证两个线程的初始版本为一致,后面修改是由于版本不一样就会修改失败
第一步:用二合一开启车门 前开(HU92)
HU92使用说明请点击查看:【实用资料】HU92新宝马/七系宝马/陆虎二合一使用方法
(为保护用户肖像权,我给加了祝福的四叶草。万恶的小编!!!)
第二步拆卸CAS电脑 (在方向盘下方),根据以往做增加钥匙经验得知,14年x3为CAS4+。14年宝马X3钥匙全丢需要拆卸发动机电脑,打开前机盖,拆掉发动机上方护板,拆下发动机电脑,护板上方便签得知电脑为N20。
拆下此CAS电脑和发动机电脑 拿回店里做钥匙。
(1)拆开CAS电脑,得知此CPU为5M48H,打开VVDIprog 编程器,选择防盗——宝马,CAS4-5M48H 备份读,按照接线图,接线读取数据并保存(下图为拆件图法)。
(2)读取发动机电脑数据——选择发动机——宝马——F-N20,按照接线图接线 (个人建议使用6.0 平刀打眼),不要一次打穿 !!!
用镊子夹掉上图铁销
宝马N20 发动机电脑读取数据时,要在发动机电脑左下角打眼,连接BOOTM线。
按照接线图接好线,在螺丝刀上焊上BOOTM线,然后用螺丝刀顶住BOOTM点,读取数据。
读取成功并保存,编程器左下角状态栏显示车架号以及ISN 码。
(3) 读取保存好CAS 和发动机电脑数据,打开VVDI2 开始写钥匙
参考: https://www.jianshu.com/p/ab2c8fce878b
https://www.jianshu.com/p/68f9cd012de8
CAS :Compare and Swap,即比较再交换。
CAS算法理解 :CAS是一种无锁算法,CAS有3个操作数,内存值E,旧的预期值V,要修改的新值N。当且仅当预期值V和内存值E相同时,将内存值E修改为N,否则什么都不做。
CAS算法图解 :
上图描述了CAS的原理,以及带来的三大问题以及问题出现的位置。
1.ABA问题
因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么CAS进行检查的时候发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。从Java 1.5开始,JDK的Atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查当前的标志是否等于预期标志,如果全部相等,则以原子方式将该应用和该标志的值设置为给定的更新值。
2.循环时间长开销大
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销,如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,它可以避免在循环的时候因内存顺序冲突(Memory Order Violation)而引起CPU流水线被清空,从而提高CPU的实行效率。
3.只能保证一个共享变量的原子操作
当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候可以用锁。还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如,有两个共享变量i=2,j=a,合并一下ji=2a,然后用CAS来操作ij。从Java 1.5开始,JDK提供了AtomicReference类来保证引用对象之前的原子性,就可以把多个变量放在一个对象里来进行CAS操作。
什么是ABA问题?比如一个线程A从内存位置M中取出V1,另一个线程B也取出V1。现在假设线程B进行了一些操作之后将M位置的数据V1变成了V2,然后又在一些操作之后将V2变成了V1。之后,线程A进行CAS操作,但是线程A发现M位置的数据仍然是V1,然后线程A操作成功。尽管线程A的CAS操作成功,但是不代表这个过程是没有问题的,线程A操作的数据V1可能已经不是之前的V1,而是被线程B替换过的V1,这就是ABA问题。
很多乐观锁的实现版本都是使用版本号(Version)方式来解决ABA问题。乐观锁每次在执行数据的修改操作时都会带上一个版本号,版本号和数据的版本号一致就可以执行修改操作并对版本号执行加1操作,否则执行失败。因为每次操作的版本号都会随之增加,所以不会出现ABA问题,因为版本号只会增加,不会减少。
参考乐观锁的版本号,JDK提供了一个AtomicStampedReference类来解决ABA问题。AtomicStampReference在CAS的基础上增加了一个Stamp(印戳或标记),使用这个印戳可以用来觉察数据是否发生变化,给数据带上了一种实效性的检验。
AtomicStampReference的compareAndSet()方法首先检查当前的对象引用值是否等于预期引用,并且当前印戳(Stamp)标志是否等于预期标志,如果全部相等,就以原子方式将引用值和印戳(Stamp)标志的值更新为给定的更新值。
AtomicStampReference的构造器有两个参数,具体如下:
AtomicStampReference常用的几个方法如下:
AtomicStampedReference的CAS操作的定义如下:
compareAndSet()方法的第一个参数是原来的CAS中的参数,第二个参数是替换后的新参数,第三个参数是原来CAS数据旧的版本号,第四个参数表示替换后的新参数版本号。
进行CAS操作时,若当前引用值等于预期引用值,并且当前印戳值等于预期印戳值,则以原子方式将引用值和印戳值更新为给定的更新值。
AtomicMarkableReference是AtomicStampedReference的简化版,不关心修改过几次,只关心是否修改过。因此,其标记属性mark是boolean类型,而不是数字类型,标记属性mark仅记录值是否修改过。
AtomicMarkableReference适用于只要知道对象是否被修改过,而不适用于对象被反复修改的场景。
number是变了的,从这里可以看出来CAS是可以修改的。这个学生签证过了。
第二个学生当时CAS上没有学校的执照号,但后来学校说这个信息不会影响到签证的,他们已经发给使馆了,最后CAS没改签证也过了的。
语言班课程结束后你的英文是需要达到B2水平的,这个地方是需要改过,tuition
fee当然也要写正确的,这样才能和你的表格填写里相一致的。
可以在问问学校,如果学校说不改对签证没什么影响的话,在递签前你可以写个说明,说明下这个情况就好了。