0%

祛魅

    这篇博客,是一个自我认知和自我醒悟的过程和思考的记录。脱离技术包袱,逃离思想束缚。		

​ 首先,我们要知道祛魅是什么?我的理解就是将一个被神话的东西理解透彻。这个是什么意思呢?很多东西被大家吹的太夸张了,但是,如果愿意花上最多100+小时的学习,就能入门,而不是大家所说高不可攀。因为,对于这些事物的不断逃避,我们不断道听途说那些被神话的技术和知识,所以,就盲目以为那些非常难做,非常牛逼,觉得自己不行,觉得它好厉害,狂拽酷霸吊炸天。但是,一旦入行,我们就会明白,其实就是那样,没啥了不起的。

​ 技术就是大家不断试错和大家统一的约定,比如协议,这个就是大家都是这样约定的,所以就有通信技术和通信协议;比如尺寸,也是大家经过不断试错,发现这个是最合适,所以就定这个了;比如开发流程,也是一样的,为什么要开发模型,为什么要架构,为什么要设备树,为什么要驱动平台,为什么要统一驱动写法,为什么要meunconfig?这些不都是大家一起约定俗称的东西,就是入门太难了,所以,给人一种高级感,一种神奇的魅力。但是,它的本质就是大家的约定俗成的协议和流程。科研的话,那个没涉及,不过,我感觉科研方面也有很多人深深陷入神话的传说之中了。牛顿晚年都信神学了。

​ 之前,我就陷入这种对于技术的崇拜,疯狂学习,疯狂思考。但是,我有一整子休息了一下,看了一些管理和资本家视频我才醒悟过来。编码技术再牛逼又如何?会的编程语言再多再熟练又如何?项目开发又快又多又如何?我们在不断钻研技术,却是陷入了资本家的陷阱。大家都说工匠精神,但是,资本家喜欢的就是这种只知道听话和干事的牛马。他们天天只喜欢技术,对于技术有一种莫名其妙的优越感。但是,在老板眼里,就是牛马,只不过是厉害的牛马。所以,大家对于技术千万不要过度崇拜,而是要学会管理和统筹规划。任何一个刚毕业的大学生都可以使用C语言在一定时期内完成一个功能,但是怎么把功能整合起来,怎么去管理,怎么去维护,怎么去分配任务,这个才是最重要的,才是最可能在未来实现独立和创业的。

​ 肯定要反驳我,说不会技术怎么创业啊?首先,要知道技术是一定要会的,因为我们很多人都是没有资本的,所以,只能靠技术来给自己建造城墙,但是会编程,会应用是真的没用的。会带队,会分配,会管理,会思考,会统筹。你会想这是cto的事情啊,所以,我们就要去学习去有目的的思考,系统的去思考。在日常工作中,把眼界跳出自己的目前的工作,去想想如果这个项目给到自己,自己该干什么?不要总是钻研技术,技术是最难赚钱,最难实现自由的,尤其是大厂,越大分的越细,虽然整体很美观很规范。

​ 想起来一个段子,一个老板问程序员还要多久完成项目。程序员说一个月左右。老板说再加一个人呢?那就要两个月了。再加一个人呢?那就不知道了。

​ 这个段子,其实就是说了一件事情,人越多它的效率其实是越低的,但是好处就是它可以可重复使用和相互配合,可以摆脱因为员工离职导致的问题。

​ 对了,大家写代码和和钻研技术的时候,一定要学会模块化,一定要想办法做可重复使用的事情,做一些关联的事情。比如一个模拟spi,这个代码,只需要改引脚(还有位带、输入输出模式、反正就是电平变化的函数等),就可以实现快速移植和反复使用了,这里就有一个就是规划了,你未来想要干嘛,你现在做的事情对于未来有帮助吗?就像未来想搞linux驱动,但是现在在搞前端开发,那有用吗?完全没有一点可重复使用性。

​ 有点偏题了,祛魅只是一个引子,主要是告诉大家,不要对技术有莫名其妙的崇拜和神话,我们要站在更高的角度和看待项目的过程。去思考一个人的时候怎么完成,去想想现在干的事情对于未来有没有用。不要今天学了modbus,明天就学can,然后洋洋得意,觉得我今天又学到了新的技术。

​ 这有用吗?肯定有用啊,老板最喜欢这样的牛马了,35岁之后直接踢了,脑子只有技术的人,怎么带队啊,后面还不听管教,自以为有技术了不起的人多的是。

​ 我们其实不需要太多太牛逼的技术,很多东西,都是有库的啊,有人写好的驱动的啊,为什么还要去干这些事情呢?我们只要有中等水平的编程能力,有高级水平的思考和架构能力就够了啊。具体实现,真的只要会c语言,啥功能都能实现的。只是效率和大小的问题,这个丢给大学生最好了,他们最喜欢干这种事情了。

​ 然后,肯定就有人想问,怎么站在高处看待这些东西呢?我这里就给出一个简单的模型吧。归纳、思考、用途、设计、诞生因素、解决了什么、整体思路、行为定性等。

1.学习归纳、整体思路、思考。

​ 我们用MCU举例子,MCU就是主控,好了,完了。那些DMA,USART、CAN、IIC、SPI、是不是就是为了和主从机通信?TIM 、VNIC、Callback是不是为了实现内部事件处理?内核指令需要吗?那些关中断、关事件、汇编代码,需要吗?系统一定是刚需吗?上系统带来什么好处?上系统解决那些多任务?那些是实现啊,给一个嵌入式毕业的会mcu的他自己会去实现的啊。

​ 是不是每一个MCU都是这样的操作,不同的就是有一些HAL,有一些标准库,有些自己的库,但是。他们的实现都是一样的,实现开启时钟,然后结构体进行初始化,绑定和复用功能,配置复用和绑定功能的配置,初始化复用和绑定功能,开启功能完事,有中断写中断回调。

​ 那我们学会了每一种MCU,看了一堆的数据手册。是不是我们就变得抢手?有用吗?CH32、GD32、AT32、STM32、瑞昱、TI、APT32、HC32够吗,孩子?学完了然后学thread-x 、freertos、ucos、rt-thread等够吗?他们是不是都是一样的思路,所以,我们学习的时候就要归纳去思考,去站在高处看待他们的流程和相似之处。

2.学习设计、解决问题。

​ 我问一下,是怎么看待协议的,比如spi、https、dns、iic、modbus、udp、tcp等。是不是有点懵,因为,你只是见一个协议就用一个协议,你知道这个从机是这个协议通信,但是,那个从机设计的工程师为什么选择这个协议,因为好玩吗?我们要打开iso那个7层协议啦,别怀疑,就是这个。我们使用pcie举例子,我们要知道pcie是占据3层的,是物理层、数据链路层、事务层。三层,前面物理层和数据链路层,我们就看到是接口就完事了。pcie是多个物理接口,而且还有电平需求,然后上面还有版本需求,不同版本之间可能还要向下兼容。但是我们可以完全只是用物理层和数据链路层,就是写自己的pcie接口,电路自己设计,这样就利用了pcie的防呆口设计了一个好的电路,至于内部的走线就可以完全使用自己的协议了。所以,协议不是死的,是有目的的使用。

​ 所以,就可以把协议分一下,有纯软件上位的,比如https、dns、pop、tfpt、fpt、mqtt等;还可以分成纯硬件的iic、 spi、485;接着就是软硬件结合的,can modbus,Lin、PCIE 、USB等。

​ 然后就是不同协议之间的电气特性,传输距离,传输成本,传输速率,传输可靠性,这些很多时候,大家开发软件的时候都不会去在意的。这有点硬件工程师的味道了,但是软件要跳出软件的范畴,要去理解硬件的工作原理,知道所有流程,知道代码怎么走的,知道代码是否能够顺利执行任务。我们要想想为什么要这个,这个可以带来什么,换掉会怎么样。所以,这个设计不但是设计,还是整个项目的统筹。我们也可以系统的学习,去明白这些设计的本质,设计的意义和为什么这样设计。

3.用途和诞生因素

​ 这个就比较杂了,你可以说我项目的用途,可以是技术的用途。但是要明白一点,你做的所有事情都是为了它的诞生因素,就是它存在的意义是什么?这话怎么理解?周鸿祎在他的视频里说过一句话,就是开发者很容易陷入疯狂的自嗨。这句话我是比较认可的,开发者总是因为自己搞出来一些牛逼的东西就很高兴很了不起,但是你干的这些事情真的有用吗?自然,自己干着玩当然没问题。但是在项目和未来创业上面,是千万不可以的,用户是不知道你为什么自嗨的,这样只会增加成本和无意义的开发浪费,这个不是预研而是自嗨,就是一堆人脱离实际的自嗨,到头来一事无成,市场根本不鸟自己,然后就乌拉(无啦)。

​ 不要,天天写代码,知道现在世界上的科技走向,看看人们需要什么,预测未来的可能有的风口,而不是傻乎乎的写代码,要知道自己的做的这些事情有没有诞生的因素,再说一遍做着玩是完全没问题的,但是想要创业和工作室,就千万不要随随便便搞这些,严格按照市场调研和开发计划做才是最合理的。

​ 所以,这里就有一个调研和思考,数据等诸多问题,这个才是一个工作室一个创业是否能成功的重要因素,就是一句话,有没有人买账!你的代码值不值钱?你的代码用途是什么?它诞生的意义是什么?是玩,还是赚钱?

4.行为定性

你要知道你做的事情,是为了什么,你做这个动作,这个行为是为了什么,不要感性的认识,更不要过度理性看待。你能控制自己的行为,知道自己行为可以带来什么,可以提供什么。说人话就是知道自己在干嘛。

注意了,有一点非常重要,就是千万不要用自己的标准去要求别人,尤其是,”为什么我可以你不可以“这种话,千万不要说,因为人与人之间本就是不对等的。知道自己说了什么,知道自己做了什么,做事情之前,问一下自己为什么要做?下决定之前,换一种语言来再次确认一篇,比如在心中用英语问自己一遍是否真的可以做这个决定。

还有就是别活得太束缚了,人不是理性的动物,人是感性的,人们喜欢骗自己是理性的,但是一切都是因为感性而发生剧变。我们要学会说废话,学会接触无用社交(不是狐朋狗友,而是可能不会带来利益的社交,但是不要过度损伤自身利益、合法的社交),给自己释放压力,不要把商业机密告诉任何非合作伙伴,因为外人是不会在乎你的利益的,只会在乎快乐,而合作伙伴之间是有利益链的。

​ 这个就是你要对自己的行为下定义,为了社交,为了娱乐,为了效率,为了工作,为了生活,为了金钱,为了家人,为了事业等。千万不要活的迷迷糊糊,到最后,很多东西都会因为自己的无心之过而丢失哦。找几个好兄弟,在一个大排档喝上一顿吃上一餐,真的很快乐哦。可能会很累,但是,无权无利,真的很尴尬,一切都要以自己为重中之重,一切都要以家人整体利益为先,好兄弟,肯定可以两刃插刀。

​ 说白了,是愿意成为自己人生的主导者,还是任劳任怨的牛马,其实都是一种活法,自然两个角度的思考、所承担的风险、难度也都是不一样的。活着累,是一种活法,活着轻松也是一种活法,因为我们都只有那么点时间和寿命的。及时行乐也是一种美丽的人生。


​ 上面都是一些我个人的观点,肯定是有错误和偏见的,所以,大家千万不要带入去看,更不要看完就有啥大情绪和思想的波动,而是换位思考,批判思考,对自己的当前状态的考量,年龄,资本,技术,人脉等诸多情况。

​ 这里,再阐述一下我的观点:千万不要陷入技术的黑窟窿之中,技术是学不完的,更加不要指望老板会养自己一辈子。人是活的,不是死的。如果宁愿当一潭死水,我是劝不动,但是,愿意走向大海的人,一定会有自己的行动。崇拜技术是大部分人、初出茅庐、老一辈的思想,千万千万千万千万不要只会写代码,写代码真的是在未来是人人具备的能力,因为AI已经开始可以根据上下文自动补全代码了,真的只会写代码,是真牛马。但是,所有代码都要有人审核、管理、运维。

​ 所以,大家要么冲着CTO出发,那可以多学一点技术,但是一定要学管理和分配,还要跟对公司和老板,多关注市场和调研;要么就是自行创业、接单(咸鱼、小红书等商单私单)、外包(是你以工作室的名义去接单)、设计、方案提供等,这个时候就要多了解市场和未来了,这个肯定是赚的更多的,亏得也更多,更不确定的事情也多,很可能是独立开发者,也可能是一个小团队,这样的日子,可能会孤独,可能会快乐,可能会到头来一无所有。

​ 如果,真的只是赚了最多10年的钱,就去卖炒饭,开个小店,做那些完全没涉及的行业,你觉得你能成功的话,你就继续给老板打工,做原始积累吧。其实打工也是有技巧的,打工也是有未来的,但是一定要公司有未来才行,然后深耕,一定一定一定要得到股份,一定要有分红,没有的话,立刻走,自己找后路。因为,在老板眼里,就是35岁立刻开除的牛马。未来是自己的,每一个人都是不一样的,这个没有老师,只有现实会不断教你做人。

​ 所以,千万千万千万千万不要陷入只知道技术,得到技术就高高在上了,你会发现一下子就到了35岁了,但是自己都不知道该怎么办了。如果你能刚毕业就有一个规划,比如去那些公司学什么技术,然后去哪一家,或者深耕变成管理等都是可以的哦。别傻乎乎的只知道写代码和学技术,多思考,多想想未来,不要被当前的美好和高工资迷惑了双眼。读书和学习的过程就是一个祛魅的过程!不要高高在上了。

美好的童年快乐一下就没了,小学也是,初中,高中大学都是,虽然当时的我是一个彻头彻尾的屌丝和逗逼,但那些都是最真实的我啊。现在的我,一定会被儿时的自己所讨厌吧!

用途

很多时候,公司电脑都是用于开发的,当中自然有很多数据和配置好的环境,操作起来非常方便,但是,我们不可能天天在屏幕前啊,一定会离开岗位的,我之前就因为要去工厂实地查看电机生产,现场改测试,现场测试,现场编程,还好我有个笔记本,可以直接远程办公快速实现,这个功能,确实不错的。还有就是编译内核的时候,几个小时都常态,所以,ssh登录挂着就好了,编译完就走了,虽然应该都是服务器去编译的。

SSH登录

说到ssh,肯定都熟悉了,毕竟搞linux,搞git都或多或少用过,这个稳定可靠安全的通信协议。Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络通信,它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。

实现原理就是非对称加密RSA了。所以私钥千万不要随便给别人,公钥可以公开哦。

ssh登录是干嘛,因为linux这种服务器系统,或者换个名称,应该是批处理系统,因为它是有多个用户的,所以每次ssh登录其实就是开辟了一个tty终端,这个终端给到我这个用户而已。ssh就干了这件事。

登录方法1:

指令行咯,前提就是双方都要ssh这个功能,都得提前安装ssh服务器。而且都启动了才行

1
2
//ssh 客户端用户名@服务器ip地址
ssh csm@192.168.1.1

这个最好固定ip比较好。

登录方法2:

公钥登录

本地生成ssh,然后把公钥发给远程主机,自己保留私钥,通过这个私钥来解密登录。

其实用过github就知道了,其实就是github里面的令牌登录和ssh公私钥匙而已。

远程主机控制

其实,看到上面这个发现了端倪,上面的其实是生成一个伪tty终端,一个终端是不能代表这个主机,现在网上有非常多维修电脑的工程师都是远程控制电脑的,对的,这就是区别,别人远程控制是整个电脑啊。

这里我就来给大家提供一个好东西,向日葵远程控制,这个确实不错的。如下图所示,这个远程协助的时候就是从机啦,下面那个设备列表就是主机,同一时刻只能有一个主机,它可以控制其他从机,注意设备从机密码。还可以通过识别码和验证码实现远程协助办公哦。

远程开机

这个就是是一个非常麻烦的东西了,现在的方案有很多。

想玩的,可以自己去尝试一下,确实挺不错的。

总结

这个就是为了方便自己搭建服务器,方便自己远程控制和出差在外,却需要一台电脑进行开发测试,都可以选择这个好方法,远程就让有了很多方法和手段,你也可以不用跑到别人公司去实地了解情况,说不定简单线上测试就能解决呢。

虚拟内存

我记得我小时,我爸买了一台1米手机,没错就是1米手机,笑死我了,他还以为是小米,不得不说,真的垃圾,还贼贵,真的小米确实是把手机打下来了。后面我换了一部联想手机,但是,用着用着,我就觉得内存好小啊,完全不够,当时是很多手机都可以root,所以,我发现我也root成功了,我还非常高兴,后面,我看到有那些刷机和扩容软件,我就试了一下,后面手机白屏了,开不了机,我觉得是这个软件把我的系统刷没了,当时也是啥也不懂,更别说用电脑去搞啥固件了。

MCU扩容

后面学习了嵌入式,我才发现,嵌入式是可以扩容的,我一开始还非常担心,这个扩容会不会不安全啊,会不会出现我小时候的问题啊,现在发现,完全不会的。扩容其实是很安全的,MCU本身也是使用了虚拟的内存来实现编址的,也就是32位4G的空间,但是,MCU根本没用到4G啊,用256kb都算大的了,虽然确实有上M大小的MCU,但是离4G空间还差远了。

SDRAM的储存单元叫BANK(一般有4个),每个BANK中以阵列形式排列,先指定BANK号和行地址,然后指定列地址,则能确定唯一地址。

就是选择和使用BANK,然后访问和使用这些地址就ok了,因为MCU早就为了这些扩容的地址进行编址了。

虚拟内存的意义

说白了,就是为了以后,虽然说一个产品出场是一定满足自身寻求的,比如笔记本电脑,他出场是一定能满足系统调度和使用,还有很多操作的,但是它允许用户扩容,也允许用户更换设备。

同时,内存是程序的以进行的基础,进程的进行内存资源是非常必要的,如何在有限的内存中运行足够大的程序,变成了一个非常有挑战的事情,而虚拟内存相对于物理内存可以提供更大的空间。

简单来说,虚拟内存可以让系统看上去去拥有比物理内存大得多的内存空间,为多道程序的执行提供了资源。

还有就是统一编址了,所有外接的内存也得满足给定的要求,这样系统和内核就能正常访问他们啦,这种随插随用的方法,非常适合嵌入式。

shell

这个在使用命令行系统的时候再熟悉不过的东西了,就是敲指令,让系统去工作。在linux中,gcc编译完毕之后会有一个a.out文件,可以./a.out直接运行,也可以在环境变量中添加这个可执行文件,就可以直接使用了。shell也是最接近内核的那一层,它可以把数据和指令传递给内核去操作和处理。

父shell

父 Shell 是用于登录某个远程主机或虚拟控制器终端或在 GUI 中运行终端仿真器时所启动的默认的交互式 Shell 。可以认为就是可执行文件的那一层的进程

子shell

子 Shell 是父 Shell 进程调用了 fork() 函数,在内存中复制出一个与父 Shell 进程几乎完全一样的子进程。所以,它有着父亲的资源。

  • 子 Shell 继承了父 Shell 的所有环境变量(包括全局和局部变量)
  • 可以通过环境变量 BASH_SUBSHELL(其值表明子 Shell 的嵌套深度)判断是第几层子 Shell(0 说明当前 Shell 不是子 Shell)
孩子shell

孩子 Shell 是父 Shell 进程调用了 fork() 函数后又调用了 execve() 函数来执行新的 shell 命令(比如 bash),从而覆盖 fork() 复制出来的 Shell 子进程。

  • 孩子 Shell 只继承到父 Shell 的全局环境变量(而不能访问到父 Shell 的局部环境变量)
  • 可以通过环境变量 SHLVL(其值表明孩子 Shell 的嵌套深度)判断是第几层孩子 Shell(启动的第一个 Shell 其 SHLVL 为 1)
shell全局变量、局部变量、环境变量

环境变量就是都可以使用的变量,全局变量就是shell代码中本文件或者链接的文件可以使用的变量,局部就是shell函数中的变量。

注意力,父shell和子shell之间的变量是独立的,只能在自己的作用范围内生效,子shell是可以追踪到父shell的id号的。

shell功能的必要性?

shell就是为了实现操作系统可以让用户输入来实现操作的一种手段,我们在使用rt-thread中,会发现,有一个cmd宏,可以添加函数进去,这样只要在虚拟串口输入指令,就可以执行对应的函数,这个是一种选择。在嵌入式中,用户的输入端可能就只有几个按钮,你说这怎么可能输入指令呢?如果是一种调试接口或者可执行的交互系统等才有有用的意义,不然就是浪费。在linux,mac,windows这些系统中才有非常有意义的作用。

shell编程

1.解释器

首先就是选择解释器,比如bash。也可以选择python作为解释器,不过这写法就要编程python的写法了哦。

2.变量和数据

然后就是全局变量,局部变量,还有外部的环境变量,这些变量有数字,有文件路径,有字符串等。

3.也是跟c语言一样,顺序判断循环,三大结构。

if elif else switch for while

4.不定长输入

还有就是shell是指令输入和执行的,所以少不了不定长,所以,就要$#、 $1、 $$ 、$* 、$@这些来做类似于argc和argv那些东西,得到数据就处理呗。

5.shell函数定义

这个太经典了。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

function func1(){
count=0
for cont in {1..3}; do
count=`expr $count + 1`
done
# 函数中使用return返回时,返回值的数据类型必须是数字
return $count
}
res1=$(func1)

7.shell格式化

因为一个数据可能是特殊指令,比如date这个是日期,但是shell可能会理解成date这个字符串,所以,我们就要告诉它是date就可以了。

8.shell引用

因为shell的变量只是容器,这个和python是一模一样的,所以,你可以把csm这个字符串赋值给一个变量,但是也可以$csm赋值给一个变量。

1
2
3
csm="1234"
echo csm #这个会打印csm
echo $csm #这个是打印“1234”

还有$(( ))${}$()等用法

$()这个会执行一边中间的shell脚本、$(( 运算式 ))、$[]运算式

9.正则表达式

shell脚本——正则表达式(包含grep详细介绍及应用)_sh脚本 if 中加 grep-CSDN博客

总结

shell就是一个对可执行文件的操作方法,可以使用编程的方法,让计算机来代替人做繁琐无意义的多次执行。可以说只有在可以操作的人机交互的界面可以使用,怎么说也得有键盘鼠标等或者每个按钮有特殊的控制上下左右。所以,低端的嵌入式设备用不到shell。shell就是执行已经写好的可执行程序罢了,然后执行完毕回到系统,继续下一个shell操作。

起因

我一直好奇,cpu是怎么工作,虽然我脑袋里面有一个雏形了,但是,这个终究是知道他是加工的,而不知道加工具体流程,虽然也确实不需要知道。然后,我无意间看到DSP芯片,他是哈佛结构的,我愣了一下。现在不应该都是哈佛结构的吗?然后我去看了一下,还真不是,现在pc端,那些大型竟然都是冯诺依曼结构,也就是普林斯顿结构,我蒙了啊,我一直以为这个结构应该淘汰了,因为不能同时取值和取指。看哈佛多好啊,指令数据分开,不同区域,可以同时获取。为什么会这样呢?我们就要先看看两个结构的区别了。

哈佛结构

这个结构就是数据和指令分来存放,这样就可以让cpu同时进行取值和取指操作,这样的效率非常高,非常适合用在MCU和DSP中,因为这中结构设计很复杂,但是效率高,而MCU和DSP本来就是简单的集成电路,所以,可以使用哈佛结构,这样可以在底层进行高效的处理。之前,我参加了rt-thread的线下会,他们的方案就是上层linux,下层rtos的mcu,这其实是一种非常有意义的设计。因为,上次的应用对于实时性和高效的要求其实是不高的。

冯诺依曼结构

这个结构是数据和指令放一起,通过不同的时期来区分数据和指令,cpu识别到是指令之后,就会去取数据,和取下一个指令,这个是一个顺序的结构,至于实现,这就是编译器和中间件的事情的,这些对于写代码是没有影响的。也不担心,指针取地址和跳转那些操作,这些都是有底层的配置和映射的。这个结构就非常简单了,光是思考这个地址就简单太多了,因为数据和指令是想要一对一的的,使用哈佛的话,这个映射就有点麻烦了,而普林斯顿可以直接写在一起,这就非常简单了。所以,冯诺依玛结构非但没有没落,反而是越高端越高级的计算机就越明显。因为得考虑成本和设计难度等诸多情况。

混合策略

现在,已经不是纯种得哈佛和普林斯顿结构了。很明显哈佛是可以选择独立编址也可以选择统一编制得,虽然普林斯顿也行,但是数据和指令分开来得普林斯顿明显更适合独立编址。举例子,比如stm32就是普林斯顿结构,但是cpu使用得哈佛的结构。这个现在太明显了,因为普林斯顿结构可以节约空间,方便设计,而哈佛结构可以增加效率同时进行。

总结

哈佛和普林斯顿现在基本上没有纯血的版本了,都是混合为主的策略。还有不用担心啥编址和地址的问题,这些都是厂商处理的,独立编址、统一编制啥的,使用独立io就可以随便调用外部的IO,也可以把我们作为开发者,只需要写好代码。