分类 嵌入式开发 下的文章

当色彩照进现实——RGB LED 驱动及控制(1)

从寻觅远古岩画到见证印象画派的繁荣,在看得见的历史长河里,绘画艺术家们对色彩的追求和运用技法的研究从未停歇。从雷火到那些神神叨叨魔法术士炉子里幻化着的各色鬼火、圣火,那些跳动着的,闪耀着的,难以捉摸。当一缕阳光穿过牛顿手里的棱镜而变得理性,当一星火花迸发在伏特的线头而将不再神秘。这时的我们(就叫 “The Light Maker” 吧),才刚刚出...

What is semihosting

Semihosting is a mechanism that enables code running on an ARM target to communicate and use the Input/Output facilities on a host computer that is running a debugger. Examples of these facilities include keyboard input, screen output, and disk I/O. For example, you can use this mechanism to enable functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host instead of having a screen and keyboard on the target system. This is useful because development hardware often does not have all the input and output facilities of the final system. Semihosting enables the host computer to provide these facilities. Semihosting is implemented by a set of defined software instructions, for example, SVCs, that generate exceptions from program control. The application invokes the appropriate semihosting call and the debug agent then handles the exception. The debug agent provides the required communication with the host. The semihosting interface is common across all debug agents provided by ARM. Semihosted operations work when you are debugging applications on your development platform, as shown in the following figure: In many cases, semihosting is invoked by code within library functions. The application can also invoke the semihosting operation directly. Note ARM processors prior to ARMv7 use the SVC instructions, formerly known as SWI instructions, to make semihosting calls. However, if you are compiling for an ARMv6-M or ARMv7-M, for example a Cortex-M1 or Cortex-M3 processor, semihosting is implemented using the BKPT instruction. Concepts The semihosting interface Can I change the semihosting operation numbers?. Using ARM C and C++ Libraries and Floating Point Support: The ARM C and C++ libraries. Reference Semihosting operations Debug agent interaction SVC...

C 语言运算符优先级

C 语言中运算符的优先级分为 15 级,从高到低依次为: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式) / 函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 ~ 按位取反运算符 ~表达式 ++ 自增运算符 ++变量名 / 变量名++ -- 自减运算符 --变量名 / 变量名-- * 取值运算符 *指针变量 & 取地址运算符 &变量名 ! 逻辑非运算符 !表达式 (类型) 强制类型转换 (数据类型)表达式 sizeof 长度运算符 sizeof(表达式) 3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 % 余数(取模) 整型表达式%整型表达式 4 + 加 表达式+表达式 左到右 双目运算符 - 减 表达式-表达式 5 <<  左移 变量<<表达式 左到右 双目运算符 >>  右移 变量>>表达式 6 >  大于 表达式>表达式 左到右 双目运算符 >=大于等于 表达式>=表达式 <  小于 表达式<表达式 <=小于等于 表达式<=表达式 7 ==等于 表达式==表达式 左到右 双目运算符 !=不等于 表达式!=表达式 8 & 按位与 表达式&表达式 左到右 双目运算符 9 ^ 按位异或 表达式^表达式 左到右 双目运算符 10 | 按位或 表达式|表达式 左到右 双目运算符 11 && 逻辑与 表达式&&表达式 左到右 双目运算符 12 || 逻辑或 表达式||表达式 左到右 双目运算符 13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 14 =赋值运算符 变量=表达式 右到左 /=除后赋值 变量/=表达式 *=乘后赋值 变量*=表达式 %=取模后赋值 变量%=表达式 +=加后赋值 变量+=表达式 -=减后赋值 变量-=表达式 <<=左移后赋值 变量<<=表达式 >>=右移后赋值 变量>>=表达式 &=按位与后赋值 变量&=表达式 ^=按位异或后赋值 变量^=表达式 |=按位或后赋值 变量|=表达式 15 , 逗号运算符 表达式,表达式,… 左到右 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。 C 语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z,则y应先与 - 号结合,执行 x-y 运算,然后再执行 +z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。如 x=y=z,由于 = 的右结合性,应先执行 y=z,再执行 x=(y=z) 运算。所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其他的都是从左至右结...

燃气表 ISO7064 MOD11,10 校验

《T/CGAS 003-2017 民用智能燃气表通用技术要求》中定义了表号编制组成为: 表号由 16 位 BCD 码组成,由表厂代码(3 位)+生产年月(4 位)+流水号(6 位)+嵌入式软件代号(2 位)+校验位(1 位)构成。 校验位算法 应采用 ISO7064,MOD11,10 校验系统校验码计算方法生成。 ISO7064 MOD11,10 校验码系统属于混合系统,它在运算中采用两个模数,其中一种模数等于被保护的字符集中的字符数,另一个模数比它大 1,形成的校验码位于被保护的字符串组成的字符集...

解决错误 modinfo can't open '...modules.dep' No such file or directory

在 ARM 开发板上查看模块信息提示题中的错误: modinfo: can't open '/lib/modules/3.2.0/modules.dep': No such file or directory 解决办法是: 1、创建文件夹:/lib/modules/$(uname -r) 2、cp xx.ko /lib/modules/3.2.0/ 3、depmod 4、mv /lib/modules/3.2.0/modules.dep.bb /lib/modules/3.2.0/modules.dep 5、modinfo xx.ko 这下就正常了 又发现: 其它模块不用重复这样做 为什么其它模块不需要这样做的?是不是只要有 modules.dep 这么一个文件名的文件存在于这里就可以来了? 再次发现: 在这里创建一个空文件就行了! touch modules.dep 那么,在 /lib/modules/3.2.0/ 中没有 ko 文件的时候,直接执行 depmod 命令是不是也可以产生空文件?答案是:是的,不过产生的是 modules.dep.bb 。为什么不直接产生 modules.dep 呢?还不清楚。有一点是可以肯定的,modinfo 使用前提是存在 modules.dep,空的就行,模块信息是从 ko 文件中获取的,跟 modules.dep 没关系。不过,为什么非要存在 modules.dep 文件呢?这也还不清楚。 我在 Ubuntu 18.04 中做了测试,内核版本是 4.15.0-36,执行 depmod 没有 modules.dep.bb 产生,直接产生 modules.dep,并且文件的内容格式与 3.2.0 中的也不一...

STM32 软件模板

创建文件目录如下: Doc 用于存放文档; Libraries 用于存放各种库,其中的 STM32Lib 是不可缺少的内核与标准外设的驱动库。原则上,所有的库都不要做任何修改,保持与原始发行状态一致。 MDK-ARM 是与 RVMDK 编译器相关的文件夹,存放工程文件、各种输出文件等; User 目录用于存放我们自己开发的代码 mcu 为 MCU 外设驱动程序文件夹; lib 为一些库程序的文件夹; bsp 为其他板载器件的驱动程序。 MDK 开发环境只支持一级组结构,所以组结构就是扁平化了的。一般包含 STM32Lib、Startup、User、Doc 等组。 把内核及标准外设的驱动(C 文件)加入 STM32Lib 组: Startup 为启动代码组,要从 .\Libraries\STM32Lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 文件夹选择一个。 将 main.c、配置、中断服务等文件加入 User 文件夹并加载到 User 组。 stm32f10x_conf.h 头文件在 stm32f10x.h 中通过判断有无 USE_STDPERIPH_DRIVER 宏定义而确定是否引用。 此外还需要配置工程,定义单片机系列(如定义 STM32F10X_CL)、选择使用标准外设驱动库 USE_STDPERIPH_DRIVER Include Paths 中配置所有需要引用的头文件所在目录 配置时钟晶体的频率 在需要操作内核或标准外设的地方直接引用库的头文件(stm32f10x.h)即可: 在编译的时候可以看到所有的库文件都被编译了,速度很慢,如果没有使用某个库文件,可以选择不编译它。 取消选择 Include in Target Build 即可。 在 C/C++ 选项卡中选中 One ELF Section per Function 选项可将用不到的函数排除在编译结果之外,从而减小生成程序的大...