本文章为技术文章,仅电子开发类人员能看懂,其他人请不要点开浪费时间。
写本文章目的是备忘。
各种MCU、DSP、CPU由于处理速度,存储器大小等资源差别巨大,采用了不同的软件架构,不同的开发调试方式,开发平台。
1,STM8 MCU单片机。
2,PI32 DSP杰理蓝牙芯片。
3,8051 MCU杰理播放器芯片。
4,全志ARM926系统芯片(上)。
5,全志ARM926系统芯片(下)。
6,单片机8051的RTX51-Tiny。
一,8051单片机引脚图:
二,由于国内大学课本的关系,8051单片机软件工程师一般是先学习汇编语言写程序,工作中逐渐改用C语言,很多C语言代码仍保留着汇编语言面向硬件的思维方式和程序结构特点。
引入新的编程思路、编程方式可以提高代码的可读可理解性,提高软件品质,并降低工作量和代码量,这一般分3个层次,
1,结构化、层次化的编程。
当代码规模达到千行以上时,软件工程师会把模块例如串口通信独立成文件编写,减少单个文件总行数以便于阅读和修改。
做得最好的是8051核专用芯片原厂的代码,把结构化层次化做得很仔细。
2,使用系统库文件的编程。
系统库文件在C:\Keil\C51\LIB,我们只要#include头文件就行。
absacc.h,数组形式绝对地址存储
assert.h,断言
ctype.h 字符类型判断、大小写转换、字符转数值。
errno.h 错误枚举值
float.h 浮点数范围
intrins.h C语言不好表达的8051特殊指令
limits.h 有无符号的字节/短整/长整型的范围
math.h 浮点型数学函数
setjump.h 设置跳转并指定其堆栈等信息,用于多线程编程
srom.h 复制rom内容到ram并运行它,仅适用于部分CPU
stdarg.h 不定参数变量处理,“...”之类
stddef.h 空指针,位置差等
stdio.h 字符串形式串口IO处理函数
stdlib.h 绝对值,支付转数值,随机数,内存分配释放等
string.h 字符串操作及内存块操作(数组操作)
使用系统库函数使得程序可以运算整数/浮点数,处理几何计算,处理字符字符串,操作ram+rom空间,使用8051特殊指令等等。
使用系统库函数可以使程序高效率,降低工作量和代码量。
也避免“土方法代码”运算的结果偏差,避免“土方法代码”的不完善不通用和难读等特点。
3,使用多线程编程。
keil C51内置了一个嵌入式操作系统RTX51-TINY。
RTX51-TINY对系统要求极低,开4个线程大约需要ROM 846 字节和ram 44 字节,占用一个timer0,AT89C2051单片机就可以运行。
多线程的编程一般把耗时任务(例如通信接收及解析)写成一个线程,使它可以按照其工作流程编写代码,在各个点把状态交给主线程。这样能使流程清晰可读,运行可靠。
思路类似于windows多线程编程,不是多进程编程。
主线程用来写主要的交互,对于耗时任务只关心其状态,不进行具体IO及运算,保证了主线程函数的代码整洁易读和运行可靠。
另外,中断服务子程序通过isr_send_signal或isr_set_ready使指定线程的os_wait返回,该线程可以立刻对采集或接收的数据进行读出和处理。这样的写法减少中断服务子程序避免中断服务子程序冗长难懂。
RTX51-Tiny函数分析、代码流程分析见附文《RTX51-Tiny代码分析》。
作者介绍:
丑木,原名黄华林,80后。
读大学期间由师兄带入电子开发路子,蹉跎岁月10多年,玩过简单应用程序开发、车载音响导航产品、数码产品、视频产品、手机产品等,无系统MCU、嵌入式系统UCOS/ThreadX、开放式操作系统Win32/Linux/android什么都做。
由于微信朋友圈内容不能对外转帖,故开通公众号瞎写东西方便转帖。
个人微信二维码:
领取专属 10元无门槛券
私享最新 技术干货