<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[可可西里]]></title><description><![CDATA[我本将心向明月，奈何明月照沟渠。]]></description><link>https://blog.youkuaiyun.com/ko_tin</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ko_tin]]></copyright><item><title><![CDATA[擦除flash需要注意什么]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/133003567</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/133003567</guid><author>ko_tin</author><pubDate>Tue, 19 Sep 2023 00:38:05 +0800</pubDate><description><![CDATA[另外，在擦除时需要注意避免将其他地址的有效内容误擦了。同上例子，如果要写地址0~10KB的内容，但是第11KB有其它有效数据，那么在写之前擦除了3页，则会把原不需要擦除的内容一并擦掉了。flash在擦除时是按照sector或者page擦除的，因此需要注意需要擦除的页数。例如，页大小为4KB，如果需要写的大小为10KB，那么需要连续擦除3页，才能保证10KB写成功。因此，在做flash上的地址分配时，需要考虑到页的大小，做好。]]></description><category></category></item><item><title><![CDATA[为什么写flash之前需要先擦除]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/133003188</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/133003188</guid><author>ko_tin</author><pubDate>Tue, 19 Sep 2023 00:13:17 +0800</pubDate><description><![CDATA[flash是一种掉电不丢失的存储介质，由于它的硬件特性（晶体管）只能从1写为0，所以在写之前，需要将当前页擦除，全部写为1，然后再写入。如果不擦除，直接写入是会失败的。]]></description><category></category></item><item><title><![CDATA[为什么不能在周期执行的中断内清狗]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/132913508</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/132913508</guid><author>ko_tin</author><pubDate>Sat, 16 Sep 2023 00:33:56 +0800</pubDate><description><![CDATA[然而一般当程序跑飞时，PC指针处于异常状态，但是MCU的中断向量表是好的，中断执行机制是正常的。因此，如果在中断函数中有清狗操作，那么当程序异常时，如果中断函数响应了，那么可能无法按照预期执行狗复位，程序也无法恢复正常了。但是需要注意，我们这里说的中断一定要是周期执行的，并且执行的周期要小于狗复位的时间，例如定时器中断或者外部周期触发的管脚中断，这种中断函数中一定不能有清狗操作。为了程序的健壮性和鲁棒性，无论中断是否为周期执行或者执行周期为多少，我们都建议不要在中断中执行清狗操作。]]></description><category></category></item><item><title><![CDATA[为什么建议将常量用const关键字来修饰]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/132893389</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/132893389</guid><author>ko_tin</author><pubDate>Fri, 15 Sep 2023 01:06:02 +0800</pubDate><description><![CDATA[如果我们将其定义在函数中，或者直接定义在全局变量中，没有用const关键字修饰，那么这些变量会被编译器分配在上面讲到的RAM区，因此会占用sram资源。当然这个做法也不是没有缺点，因为对于MCU来说，访问sram的效率会高于内部flash，如果不是追求极致的运行速度，那么建议用const修饰，否则不建议；一般来说我们的程序是放在内部flash中运行，在MCU中，内部flash资源远大于sram资源，因此这是一种牺牲内部flash来换取sram资源的办法。嵌入式软件中，内存资源是非常宝贵的，即sram资源。]]></description><category></category></item><item><title><![CDATA[为什么浮点数不能和0直接比较]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/132893290</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/132893290</guid><author>ko_tin</author><pubDate>Fri, 15 Sep 2023 00:31:45 +0800</pubDate><description><![CDATA[诸如此类，都是不可取的，这里就和浮点数在计算机内存中的表示方法有关系了，比如浮点数1.0f在内存中可能为0.99999xxx，并不是一个精确的1.0f，并且浮点数0.0f在也有可能为0.00000xxx，具体值是多少，可以在IAR中查看。因此直接做比较，可能会造成误判。]]></description><category></category></item><item><title><![CDATA[嵌入式中断函数设计]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/132867278</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/132867278</guid><author>ko_tin</author><pubDate>Thu, 14 Sep 2023 00:06:54 +0800</pubDate><description><![CDATA[即使用GPIO管脚作为中断源，连接外设，通过外设拉高或者拉低管脚，触发外部管脚中断；]]></description><category></category></item><item><title><![CDATA[通信接口互斥设计]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/132843175</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/132843175</guid><author>ko_tin</author><pubDate>Tue, 12 Sep 2023 23:30:59 +0800</pubDate><description><![CDATA[当命令处理是操作系统中的一个线程，并且线程的优先级高于定时任务，则存在互斥问题，需要考虑场景：当定时任务中访问外设时，被命令处理打断，需要使用信号量进行互斥处理。- 当定时任务是操作系统中的一个线程，并且线程的优先级高于命令处理，则存在互斥问题，需要考虑场景：当命令中访问外设时，被定时任务打断，需要使用信号量进行互斥处理。锁中断是一个高危操作，有可能会导致中断函数不能及时执行，更严重的甚至会丢中断，因此需要结合软件的业务特点整体设计考虑，是否能锁中断，以及应该在哪里锁中断！1. 软件初始化过程中通信。]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第13章 显示锁]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/108374958</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/108374958</guid><author>ko_tin</author><pubDate>Thu, 03 Sep 2020 09:02:36 +0800</pubDate><description><![CDATA[内置锁的局限性：无法中断一个正在等待获取锁的线程，或者无法在请求获取一个锁时无限的等待下去。内置锁必须在获取该锁的代码块中释放，这就简化了编码工作，并且与异常处理操作实现了很好的交互，但却无法实现非阻塞结构的加锁规则。这都是使用synchronnized的原因。
13.1 Lock与ReentrantLock
必须在finally中释放锁
Lock lock = new ReentrantLock();
...
lock.lock();
try {
	// 更新对象状态
	// 捕获异常，并在必要时恢复不变]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第11章 性能与可伸缩性]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/108252371</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/108252371</guid><author>ko_tin</author><pubDate>Thu, 27 Aug 2020 09:02:11 +0800</pubDate><description><![CDATA[线程的主要目的是提高程序的运行性能。
提高资源利用率，系统响应性。
11.1 对性能的思考
多线程开销：线程之间的协调（加锁、触发信号、内存同步），上下文的切换，线程创建和销毁，线程的调度。
可伸缩性：当增加计算资源（CPU、内存、存储容量、IO），程序的吞吐朗或者处理能力相应增加。

...]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第10章 活跃性、性能与测试]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/108139837</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/108139837</guid><author>ko_tin</author><pubDate>Fri, 21 Aug 2020 09:05:55 +0800</pubDate><description><![CDATA[过度地使用加锁，可能导致锁顺序死锁；
过渡的使用线程池和信号量来限制对资源的使用，可能导致资源死锁；
10.1 死锁
java无法从死锁恢复；
数据库设计一般可以恢复，会选择一个牺牲者放弃这个事务。
10.1.1 锁顺序死锁
如果所有线程以固定的顺序来获得锁，那么程序中就不会出现锁顺序死锁问题。
right -》left
left -》right
10.1.2 动态的锁顺序死锁
有时候并不清楚是否在锁顺序上有足够的控制权来避免死锁发生。

...]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第9章 图形用户界面应用程序]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/108139698</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/108139698</guid><author>ko_tin</author><pubDate>Fri, 21 Aug 2020 08:45:11 +0800</pubDate><description><![CDATA[9.1 为什么GUI是单线程的
多线程GUI框架容易发生死锁问题。
单线程的GUI框架使用线程封闭机制来实现线程安全性。
9.2 短时间的GUI任务
9.3 长时间的GUI任务
9.4 共享数据模型

]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第8章 线程池的使用]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/107800315</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/107800315</guid><author>ko_tin</author><pubDate>Tue, 04 Aug 2020 21:58:58 +0800</pubDate><description><![CDATA[8.1 在任务与执行策略之间的隐形耦合
只有当任务都是同类型的并且相互独立时，线程池的性能才能达到最佳。
8.1.1 线程饥饿死锁
在池中，如果任务A依赖其他任务B，任务B无法完成或者被阻塞，那么可能产生死锁，称为线程饥饿死锁。如果线程池足够大，可能不会死锁。
每当提交了一个有依赖性的Executor任务时，要知道可能会出现线程的饥饿死锁，因此需要配置线程池的大小限制或配置限制。
8.1.2 运行时间较长的任务
如果任务阻塞的时间过长，即使无死锁，线程池的响应性也会变得糟糕。执行时间长的任务不仅会造成线程池]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第7章 取消与关闭]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/107622352</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/107622352</guid><author>ko_tin</author><pubDate>Mon, 27 Jul 2020 23:05:57 +0800</pubDate><description><![CDATA[Java没有提供任何机制来安全地终止线程。但它提供了中断，这是一种协作机制，能够使一个线程终止另一个线程的当前工作。这种协作方法是必要的，我们很少希望某个任务、线程或服务立即停止，因为这种立即停止会使共享数据结构处于不一致的状态。在编写任务和服务时可以使用一种协作的方式：当需要停止时，它们首先会清楚当前旨在执行的工作，然后再结束。任务本身比发出取消请求的代码更清楚如何执行清除工作。行为良好的软件能很完善的处理失败、关闭和取消等过程。
7.1 任务取消
在Java中没有一种安全的抢占式方法来停止线程。只有一些]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第6章 任务执行]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/107098073</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/107098073</guid><author>ko_tin</author><pubDate>Fri, 03 Jul 2020 09:01:42 +0800</pubDate><description><![CDATA[6.1 在线程中执行任务
在理想情况下，各个任务之间时相互独立的：任务并不依赖于其他任务的状态、结果、边界效应。
应用程序性希望支持尽可能多的用户，从而降低每个用户的服务成本，而用户则希望获得尽快的响应。
6.1.1串行的执行任务
6.1.2 显示地为任务创建线程
只要请求到达的速率不超出服务器的处理能力。
6.1.3 无限制创建线程的不足
线程生命周期的开销非常高
资源消耗
稳定性：线程数的限制值随平台不同，并受JVM启动参数、Thread构造函数中栈大小、以及地层OS对线程的限制等。会抛出OOM等异常。]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第5章 基础构建模块]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/106935709</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/106935709</guid><author>ko_tin</author><pubDate>Wed, 24 Jun 2020 01:03:06 +0800</pubDate><description><![CDATA[委托是创建线程安全类的一个最有效的策略：只需让现有的线程安全类管理所有的状态即可。
5.1 同步容器类

]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第4章 对象的组合]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/106878662</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/106878662</guid><author>ko_tin</author><pubDate>Tue, 23 Jun 2020 23:25:26 +0800</pubDate><description><![CDATA[4.1 设计线程安全的类
三要素：

找出构成对象状态的所有变量
找出约束状态变量的不变性条件
建立对象状态的并发访问管理策略

4.1.1 收集同步需求
状态空间：对象与变量的所有可能取值。状态空间越小，越容易判断线程的状态。final类型的域使用得越多，就越能建华对象可能状态的分析过程。
4.1.2 依赖状态的操作
类的不变性条件与后验条件约束了在对象上有哪些状态和状态转换是有效的。
4.1.3 状态的所有权
4.2 实例封闭
将数据封装在对象内部，可以将数据的访问限制在对象的方法上，从而更容易确保线程]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第3章 对象的共享]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/106779628</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/106779628</guid><author>ko_tin</author><pubDate>Tue, 16 Jun 2020 09:09:56 +0800</pubDate><description><![CDATA[3.1 可见性
在没有同步的情况下，编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。
3.1.1 失效数据
3.1.2 非原子的64位操作
最低安全性：即使是失效值，但至少是之前的值，不是随机值。
例外：非volatile类型的64位数值变量（long、double）。
Java内存模型要求：变量的读取或写入都是原子操作，但是对非volatile的long和double变量，JVM允许将64位的读操作或写操作分解为两个32位的操作。
当读取一个非volatile的long变量时，如果]]></description><category></category></item><item><title><![CDATA[Java并发编程实战 第2章 线程安全性]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/106654333</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/106654333</guid><author>ko_tin</author><pubDate>Wed, 10 Jun 2020 01:23:19 +0800</pubDate><description><![CDATA[在构建稳健的并发程序时，必须正确地使用线程和锁。但这些终归只是一些机制，要编写线程安全的代码，核心在于要对状态访问操作进行管理，特别是对共享的和可变的状态的访问。

]]></description><category></category></item><item><title><![CDATA[Python CSV Reader/Writer/DictReader/DictWriter例子]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/72627266</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/72627266</guid><author>ko_tin</author><pubDate>Mon, 22 May 2017 16:05:49 +0800</pubDate><description><![CDATA[CSV(comma-separated values) 是跨多种形式导入导出数据的标准格式，比如 MySQL、Excel。它以纯文本存储数和文本。文件的每一行就代表一条数据，每条记录包含了由逗号分隔的一个或多个属性值。这个标准格式的名字来源就是每条记录是用逗号将其属性分隔的。即使有这个非常明显的命名标准，而实际上却没有一个官方的标准 CSV 格式，有可能是以一些比较类似的分隔符来分隔数据，虽然它们的]]></description><category></category></item><item><title><![CDATA[Python 操作 MongoDB]]></title><link>https://blog.youkuaiyun.com/ko_tin/article/details/72621615</link><guid>https://blog.youkuaiyun.com/ko_tin/article/details/72621615</guid><author>ko_tin</author><pubDate>Mon, 22 May 2017 10:07:52 +0800</pubDate><description><![CDATA[这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面上的教程一般都是讲解JavaScript的脚本操作,本文则是基于Python,需要的朋友可以参考下
0.启动mongodb数据库
$ mongod.exe --dbpath D:\mongodb\data\db
1.连接数据库
MongoClient VS Conne]]></description><category></category></item></channel></rss>