编程如何让角色往左走(教小路同学编程序之二尽可能避免以其昏昏使人昭昭)
编程如何让角色往左走(教小路同学编程序之二尽可能避免以其昏昏使人昭昭)
2024-11-22 04:01:11  作者:遗忘之地  网址:https://m.xinb2b.cn/sport/bmw509569.html


《孟子·尽心下》中这样说:“贤者以其昭昭使人昭昭,今以其昏昏使人昭昭”。这句话很多人深以为然。特别是写程序,如果程序员都不知道写的代码的精确行为,最后的调试周期可能很长。

渔夫第一次写程序是1982年,毕业设计的题目用ALGOL 60编程语言编一个计算风扇电机电磁计算的程序。

当时那台计算机叫做TQ-16,是山东工学院的,占地100多平方米,名字的本意应该是图强吧。感觉计算机的外部存储器是磁鼓,内部存储器是磁珠,容量都不大。那年才18岁,好奇心实在是太大了。有一次进机房送我编的程序,正好赶上机器故障,一个维修工程师在看一个磁珠存储器,听他的意思是256bitx1的感觉,大概1厘米多厚,30x30厘米那么大。别当真,凭记忆。不过今天的手机内存12G,你算算用磁珠要多大地方。

这种计算机编程序,以其昏昏使人昭昭肯定没门了。渔夫写程序的媒介是纸带,工具是凿子,在纸带上打孔。下面这个纸带的第二行编码是空格的意思(左边第三列一个孔),第三行编码是”J”(左边第二列一个孔,右边第二列和第四列各一个孔)。


编程编到了凿几个孔,在哪凿孔都需要一清二楚,这个确实算以其昭昭了。

但是,随着系统的复杂,每一个开发都是在平台上完成的。渔夫当年的凿子变成了现在几个G的软件包。安装上IDE,配置好开发环境,找到例程,改吧改吧就做完了。

如果一切顺利,那就是真的顺利。万一出一点问题,就应了那句话以其昏昏何以使人昭昭?你自己都没明白写这些代码有啥用,怎么去分析问题解决问题?

但是,趋势是今后搞明白平台本身就是一件难事,而且会越来越难。所以渔夫的这篇告诫,你可以看作是一个挣扎。只有你不断地挣扎,才有可能不被越来越复杂的系统淹没。保留你的挣扎吧,万一(其实极有可能是十一)你需要呢?

小路同学最近做的项目是用TMS320F28030写一组软件。渔夫看了小路同学写的28030软件,提了几个问题,小路同学表示不清楚,看别人这么写,就抄了。

在叙述正式话题之前给大家推荐一个软件工具,叫做eMule,中文名字叫做电骡,是一款P2P的文件共享机制。建议朋友们安装用一下,本公众号的许多文件给出的链接都是基于eMule的。

这篇文章涉及三个文件:

F2803x.h:ed2k链接为:ed2k://|file|F2803x.h|6813|C886CC837A9A338FBDA7ED8AD75D8DC2|h=PSRD6277XZJZZ7ZOHBJ4KDHQ23HTBVO3|/main.c: ed2k链接为:ed2k://|file|main.c|782|F923D485C6BAAB089FBAC7C7B41029DB|h=UCV3W734OSERMWITYP4ZYKSNN7UQCGK7|/PowerOn.c: ed2k链接为:ed2k://|file|PowerOn.c|2626|5CB0DEDF00F3B1AB6B4C64FB340FA4E5|h=PMEDD3NAPLTCVJR24BHH4SMGL63WHV5X|/

如果你不能下载这些文件,请在订阅号上留言。


在这一期的例子中,我们让板子上的两个LED灯,一个连接在GPIO-12上,亮一秒、灭一秒;一个连接在GPIO-16上,亮两秒、灭两秒。提前说明,为了让本文不至于过于臃肿,有些初始化细节没有提及,会在后继的文章中写清楚。

在main这个函数里,三个初始化函数后,开始启动Watchdog。然后将CPUTimer1的计数值抄录到TimeStampLED中。这个计数值是每微秒递减,硬件自动完成的。

主循环目前只运行一个任务:BlinkingLED(),然后清掉看门狗。


BlinkingLED()中首先确定是否经过了一秒?算法是TimeStampLED减去timer1计数值是否大于等于100万。不足一秒就退出。

每一秒首先是三个动作:①刻舟求剑,记下下一个一秒的TimeStampLED。②反转GPIO-12这个LED灯,原来亮变成灭,原来灭的现在变成亮。TI在2803x上动了心思,对GPIO的操作有个Toggle寄存器,对于闪灯这样的操作是绝配。③seconds这个变量加一。我们选择这个变量为偶数时反转GPIO-16这个管脚,达到亮2秒灭两秒的目的。

需要说明的是,由于进入BlinkingLED这个函数的时间非常不确定,所以每一次刻舟求剑都是用了上次TimeStampLED加上百万微秒的确定时间,这样虽然LED闪动的时刻会有微小的晃悠,但是每分钟30下,每小时1800下这个是固定的,时间没有累积误差。

如果把TimeStampLED -= 1000000;换成TimeStampLED = *regTIMER1TIM; 时间误差会积累。

这个例子是完全依靠查询的编程模型。仅仅一个任务,在60M钟频的2803x,最坏情况下也不需要一个微秒就能完成一个循环;尽管每个循环的时间并不相同,但是,依靠CPUTimer1的定时,系统还是能够相对精确地满足应用的需要。

渔夫为了帮助小路同学相对深入地了解2803x处理器,看了一些书,尽管这些内容都是看书来的,也别浪费了,附在下面。

在上电后都要做一些前期配置,一般叫做初始化程序。


28030的核心部件的初始化内容包括时钟与定时器、存储器等。在DevicePowerOn()这个函数里面主要做了这么几个操作:

1. 关闭看门狗。

2. 主时钟时钟源为INTOSC1,12倍锁相环,除2作为SYSCLKOUT。

第一个操作通常是操作WDCR,地址为:0x7029,名字叫Watchdog Control Register。之所以把这个寄存器的操作放在首位,是因为在RESET之后系统默认Watchdog是enable态,如果不能在规定时间内响应,可能会再次触发RESET。

WDCR的D7:WDFLAG这一位是个状态,等于1时表示这个RESET是因为Watchdog引起的,等于0表示由于复位脚引起的。几十年前,渔夫的一个项目就是为了得到这一状态搭了一堆电路。另外,这是一个只读位。

WDCR的D6:WDDIS等于0表示Watchdog是Enable的,也是RESET默认状态,等于1表示关闭Watchdog。上电时由于不能确定初始化的时间暂时关闭Watchdog,这是一个稳妥的策略。

WDCR的D5~D3:WDCHK,这三位读出时总是000,写入时应该时101。

WDCR的D2~D0:WDPS,默认为0,表示Watchdog counter的输入钟频为内部时钟分频512,可以写入其他值依次减慢输入时钟。


接着要进行的操作是时钟校准与ADC校准的操作。这个操作的方法TI放在芯片上,映像的地址0x3D7C80。这一段程序怎么操作,耗费时间渔夫没去查,估计很难查到,估计即便查到也是晦涩难懂,属于被动性以其昏昏的范畴。渔夫长期职业生涯中养成的对细节精益求精的习惯被技术进步的潮流碾压。

由于不知道校准程序需要多长时间,顺便验证了关闭Watchdog的重要性。

28030有四个时钟源,分别是:内部零引脚振荡器INTOSC1和INTOSC2,通过晶振引脚形成的时钟源XTAL OSC,通过时钟引脚引入的时钟XCLKIN。

CLKCTL寄存器用来配置这些时钟,寄存器地址0x7012。

CLKCTL-D15:NMIRESETSEL,默认为0,此处不讨论。

CLKCTL-D14:XTALOSCOFF,== 0 XTAL OSC启用,默认值。== 1 XTAL OSC关闭。

CLKCTL-D13:XCLKINOFF,== 0 XCLKIN启用,默认值。== 1 XCLKIN关闭。

CLKCTL-D12:WDHALTI,== 0 Watchdog在HALT指令时停止,默认值。== 1 Watchdog在HALT指令时继续起作用。

CLKCTL-D11:INTOSC2HALTI,== 0 Internal Oscillator 2在HALT指令时停止,默认值。== 1 Internal Oscillator 2在HALT指令时继续起作用。

CLKCTL-D10:INTOSC2OFF,== 0 Internal Oscillator 2启用,默认值。== 1 Internal Oscillator 2关闭。

CLKCTL-D9:INTOSC1HALTI,== 0 Internal Oscillator 1在HALT指令时停止,默认值。== 1 Internal Oscillator 1在HALT指令时继续起作用。

CLKCTL-D8:INTOSC1OFF,== 0 Internal Oscillator 1启用,默认值。== 1 Internal Oscillator 1关闭。

CLKCTL-D7~D5:TMR2CLKPRESCALE,== 000 Timer2时钟Pre-Scale 为1,默认值。

CLKCTL-D4~D3:TMR2CLKSRCSEL,== 00 Timer2时钟源为SYSCLKOUT,默认值。

CLKCTL-D2:WDCLKSRCSEL,== 0 Watchdog的时钟源为Internal Oscillator 1,默认值。== 1 时钟源为外部时钟源或Internal Oscillator 2。

CLKCTL-D1:OSCCLKSRC2SEL,== 0 选择外部时钟源,默认值。== 1 选择Internal Oscillator 2。

CLKCTL-D0:OSCCLKSRCSEL,== 0 选择Internal Oscillator 1,默认值。== 1 选择Internal Oscillator 2或者外部时钟源,具体看CLKCTL-D1。

上面的程序我们选择了Internal Oscillator 1作为主时钟源,频率大约10MHz。可是28030可以运行到60MHz的钟频,下面的操作控制锁相环乘以12倍,然后除以2作为系统时钟。

TI给出这个操作的流程如下,抄下就好。


这一小节就写到这里吧。

  • 戌戍戊戎读音顺口溜(戊戍戌)
  • 2024-11-22戊戍戌戊,拼音Wù;戍,拼音Shù;戌,拼音Xū;戎,拼音róng1、戊,同误,天干的第五位,如“戊更”,是指夜晚五更,如“戊戌变法”,是指1898年的戊戌维新2、戍,同术,军队守卫的意思;如卫戍、戍边、戍。
  • 骨汤正宗做法(骨汤这做法太牛了)
  • 2024-11-22骨汤这做法太牛了​你好我是原创作者:为爱下厨教给大家用最简单的方法,做出不一样的独特美食省力、又省心,做出营养又好吃的美味让饭菜充满浓浓家乡的味道,一起分享分享给爱人与家人让我们一起努力成长,做出充满爱的美食《滋补大。
  • 吕梁市野坡沙棘汁(吕梁特产沙棘汁)
  • 2024-11-22吕梁特产沙棘汁沙棘汁是由沙棘,俗名醋柳、酸溜溜榨汁所得起源于地质运动的冰期和间冰期,经过亿万年严酷的自然选择,沙棘以其超凡的生命力傲立于世,被誉为植物中的“生命之王”、“21世纪人类健康的保护神”沙棘喜阳,粗状的枝。
  • 王者荣耀卡伏地魔教程(太古魔导巧用技能威力无穷)
  • 2024-11-22太古魔导巧用技能威力无穷说到一个被很多人都嫌弃的法师,相信很多人都能想到姜子牙姜子牙的前期伤害低,只有软性控制,移动速度低,大招需要长时间蓄力等等原因,都让他成为了一个不讨好的英雄但是不受欢迎就一定是鸡肋么?小编告诉你:不一。
  • 今天吃什么餐(今天吃什么饭最好吃)
  • 2024-11-22今天吃什么饭最好吃在这个繁忙的世界里,我们总是在为生活奔波,而忽略了生活中的小确幸今天晚饭吃什么?这个问题看似简单,却蕴含着我们对美食的热爱和对生活的追求我们要考虑食材的搭配一顿美味的晚餐,离不开新鲜的食材我们可以根据。
  • 回不去的从前现场完整版(回不去的从前)
  • 2024-11-22回不去的从前走走停停,已过半年读懂了人心,看透了生活,我总担心会失去谁,但唯独问谁又怕失去我,现实的社会读懂了自己,明白了一切看透就好自己开心最重要,过去的会过去,美好的会回来一切都会看到阳光,。
  • 男朋友和闺蜜之间的战争(我和女友的闺蜜结婚了)
  • 2024-11-22我和女友的闺蜜结婚了我所在出租车行的接线台有三个女孩子,一个胸很大,另一个皮肤很白,第三个笑起来脸上有酒窝我们几个无聊的出租车司机曾私下讨论过这三个女孩子我偷偷地喜欢三号,那几个家伙批评她胸不够大时,我真想打人每当公司开。
  • 中美登月计划现状对比(国之重器500吨级的它来了)
  • 2024-11-22国之重器500吨级的它来了从汽车发明到飞机、火箭升空,燃烧的力量推动人类文明向前大步跨越在工业文明时代,如何提高发动机的燃烧效率,如何高效征服和使用动力,始终是工程师们不断探索的领域中国首台50兆瓦重型燃气轮机点火试验成功重型。
  • 盘古开天辟地源自哪里(都说盘古开天辟地)
  • 2024-11-22都说盘古开天辟地汉族传说在天地还没有开辟以前,宇宙就像是一个大鸡蛋一样混沌一团有个叫做盘古的巨人在这个大鸡蛋中一直酣睡了约18000年后醒来,盘古凭借着自己的神力把天地开辟出来了他的左眼变成了太阳,右眼变成了月亮头发。
  • 墨鱼怎么洗才干净(干制墨鱼可以这样清洗)
  • 2024-11-22干制墨鱼可以这样清洗先将墨鱼干整个泡到清水中,大约需要泡10个小时,中途可以换水3-4次,直到墨鱼变软,如果需要加快这个过程,可以用温水,加适量的碱墨鱼干泡软之后,将表皮剥去剥皮时,从边缘剥起,要剥干净剥皮之后,将墨鱼的。