关于划分和TI的问题

“不要炫耀,玛丽亚·伊凡诺芙娜,听听你最喜欢的歌《瓦伦基》



尽管有标题,但介绍的顺序是相反的-首先是关于德州仪器(当然不是公司本身,我仍然是工程师,而不是培训师,业务分析师,因此是公司生产的产品),然后才是部门。

Marlezon芭蕾舞的第一部分。

讨论的主题将是相对较新的SS13xx系列(SS1310 / SS1350 / SS1352),但这只是讨论嵌入式系统编程领域的情况的起点。 该MK旨在用于具有各种类型的无线接口的设备的设计中(我不太喜欢IoT这个新名称,尤其是因为它没有穷尽使用此系列的可能性)。

MK是在M3内核的基础上构建的,具有完全可以接受的功能,尽管它没有记录程序和数据的频率和内存大小的破坏性参数,但它具有足够的接口集,但是这些参数绝不是有趣的。 其特点是微电路包含三个MK内核,一个中央内核和两个外围内核,用于与外部设备一起工作并通过以太交互。 做出此决定的原因是什么?

首先,要确保最小的能耗。 事实是,通过在相对较短的时间内执行资源密集型计算,然后在时钟频率降低的情况下切换到待机模式来降低功耗的传统方法具有自然的局限性,我们将在较低的频率下消耗相对较快的内核,而没有提供所需的响应时间来降低功耗。外部事件。 为了消除这种矛盾,引入了传感器控制器的第二个内核,该内核在低功耗模式下提供了与外界的交互,并且在需要进行资源密集型计算时,它激活了主内核。

第三个控制器解决(尽管非常复杂)减少能耗的相同任务。 事实是,维护无线电交换协议通常需要维护非常严格的时间限制,并且尝试在中央核心上实现它们(与执行目标程序同时)将需要增加核心时钟频率,并因此需要增加电源消耗的功率。 功能分离可以消除这种矛盾(TRIZ风格的典型解决方案)。

我绝对不确定这种功能的分离是绝对必要的,并且无法通过更简单的体系结构解决方案实现所需的参数,但是如果价格保持在合理的框架内并且实现了必要的功能,那为什么不这样做。 而且,该帖子仍然与MK的硬件组件无关,仅是介绍情况。 我们将考虑为此类MK创建软件的过程。

首先,主内核在这里是所有标准的东西-M3内核本身是众所周知的,工具链是gcc,该公司本身推荐两个IDE:ccs和iar。 我与其中的最后一个人一起工作了很多,所以我决定尝试TI集体智慧的条顿人天才所产生的那种产品。 Code Composer Studio是公司的发展,并且完全免费(没有任何限制),基于Eclipse(具有该想法的人),并且具有该环境固有的所有优点和缺点。

我唯一想表达一下困惑的是,该公司好心地提供了其他实用程序来使用该MK(用于通过以太创建可启动固件映像并将其传输到MK),但是出于某种原因,它们不是用Java编写的,这是编程环境和运行时系统的基础,该系统和运行时系统是安装包的一部分,并位于Phyton上。 并不是我强烈不喜欢后者(尽管有一个,我不接受使用缩进来设置程序结构,但最后“颜色和颜色不同”),但是尚不清楚为什么有必要吸引明显多余的实体。 而且,这些实用程序本身并不复杂,它们不使用特定的库,并且在很短的时间内就由作者转移到Java,而丝毫没有增加程序长度20%的困难,而且,这有点奇怪,没有明显的速度变化(考虑到主运行时与读取文件相关联,这并不令人惊讶-Funtik F ...的最新笔记。

难题的第二部分在于以下事实:由于易于嵌入插件,Eclipse本身很受欢迎。 考虑到这一事实,编程环境的开发人员决定让用户从命令行使用句柄来调用实用程序是非常神秘的,之前已在开发环境中使用句柄禁用了终端并使用句柄在MK上启动了数据接收程序,然后再次使用句柄恢复了终端。 也许对于“印度程序员”来说,这种解决方案似乎是唯一可行且完全合理的,但是一家大公司有能力吸引更多合格的人才,我可能对此一无所知。

此外,使用Sensor Composer Studio产品执行传感器控制器的编程(名称不是很成功,但它是直接描图纸)。 紧接着又是一个问题-为什么必须要有一个单独的产品,不是说切换窗口很困难,而是...,尤其是因为创建的代码最终成为了主MK的代码的一部分(当然,在那里未执行,但包含在程序存储器的常规地址空间中)。

这是另一个功能-除了16位,低功耗和专有的内核外,他们没有告诉我们任何有关此内核(其体系结构)的信息。 一般来说,没关系,它运作良好且运作良好,但“沉积物仍然存在”。 以下是对该内核命令的描述,根据该内核,我们可以假定这是对430的修改,尽管具有诸如用于组织循环的命令之类的功能。 给出了外围寄存器在通用地址和本地地址空间中的位置,然后又发生了奇怪的事情-许多寄存器(包括外围寄存器)都伴随有短语“仅由TI库使用”,并且对于某些寄存器,仍给出了位域分配,并且对于有些不是。 并不是这些寄存器的描述让我感到困扰,但是如果用户不打算使用它们,为什么要给它们-我个人不太了解。

您还可以使用特殊的库从主内核访问该内核的外围设备,与此同时,您可以再次使用某些插件在上述编程环境中编写代码。 这里一切都很好,文档就足够了,设置很方便,设置的图形化表示,在特殊模式下进行内置调试(在常规模式下,调试器忙于主内核),总的来说是相当值得的。

下一部分是基于M0构建的用于无线电的内核,它从其自己的ROM执行程序(很可能是非易失性存储器的一部分,现代MK不太可能具有屏蔽存储器),无法修改(至少在此方面)。文档,一个字)。 有关无线电通道内部结构的信息极为匮乏,实际上,只能从模式设置命令的描述中提取信息,而通常的“内置”开发人员则不需要。

主核心和无线电部分之间的交互基于消息流,该消息流已进行了详细记录。 而且该文档足以理解简单的内容-您不会(当然,我绝对不会)建立内核之间的交互机制,尤其是通信协议,但是您将使用由公司实现的库,因为即使使用它,交互也相当复杂设计应考虑大量的各种因素,以便编写自己的程序包的好处不会抵消创建程序包的成本。 因此,我们再次使用库子层来组织主核心与无线电核心之间的交互,并且很可能会使用现成的解决方案,使用现成的模块来组织标准化的无线电通信信道,而仅使用信道参数化。

我认为对读者来说很清楚,为此MK编写完善的程序不是一件容易的事,高级专业人员可以轻松完成,但是“普通”开发人员应该怎么做(正如Oleg Artamonov最近写道:“您已经意识到选择时犯了一个大错误。专业?”)。 该公司处理了这种情况,并与开发环境一起提供了适合所有场合的大型程序包(示例集),称为SimpleLink。 此外,解决方案有两个版本-都使用TI-RTOS实时操作系统(在我看来,这是一种更方便的方式),并且以超级周期(如果您讨厌内置OS,以至于您无法食用) ”)。 我对MK上的RTOS感到很平静,因此我使用第一个选项并建议您这样做,特别是如果您了解OS生成过程的配置并使其适合您的任务类别,则可以节省易用性,并大大降低了维护此便利性的成本。

我个人对此软件包的态度是双重的-一方面,这是一项出色的工作,确实极大地简化了MK的使用(因此,我使用了它),但另一方面-“垃圾,烧伤和鸡奸”,这是一个很好的例证,“如果看起来好的建筑的成本似乎很高这对您来说很高,请考虑一下不良体系结构的成本。”(这就是为什么要责骂他。)这不仅涉及模块的功能分布以及它们之间的关系(尽管这并非一帆风顺),而且还涉及文件,文件名,分布的模块分布 文件,按目录,它们的名称和结构等。等等。违反KISS和DRY的原则几乎是软件包开发人员的规则,但是,如果我不了解软件包的源代码(我无法摆脱这种愚蠢的习惯),并按原样使用它,那么一切都很好,至少我没有在特定项目中发现任何问题(除了受到侮辱的审美感觉和对人性的迷恋之外)。

但是现在您可以平稳地转到该帖子的主要假设(迟到总比不到好)。 我一直认为编写一个真正具有多功能性和高性能的框架非常困难。 该公司提出的开发示例就是这样一个强调多功能性的框架,几乎完全没有应用程序定制工具,所有事情都只是在调整凝块的水平上。 拿我们众多的例子中的一个,更改与测量和分析(当然还有传输)相关的一小部分,就可以了。 当然,在一般情况下,生成的代码会很膨胀,但是我们将为您提供各种示例,以适合不同的应用程序条件,而您只需要选择最适合您的任务即可。 在极端情况下,MK内置了大量程序存储器,因此您不必考虑保存此资源。 而且,很大一部分执行库已经隐藏在ROM中,您只需要小心地调用它们即可。

我并不是反对这种方法,而是坚决坚持自行车的发明,代码重用绝对是当务之急,是保证高程序员生产率的保证,但是要满足以下条件-
使用的例程库应为:

  1. 精心设计
  2. 编程整齐
  3. 全面记录
  4. 万能的
  5. 有效。

而且,如果仅希望最后两点(非常可取,但是...),那么前三点是必需的。

公司提供的SimpleLink软件包的要求如何? 以下是按五分制进行的评估,这些评估是从对包装的表象中获得的。

1a)应该考虑模块之间的连接,应该清楚地勾勒出每个模块的能力边界,消除功能的重复,制定出接口-牢固的四个,整体工作已经完成。

1b)将模块分发到具有经过深思熟虑的目录结构的文件中时,可能需要三个加号,这只值得在不同文件中重复程序模块的文本。

2.程序包不应有难以发现的很少显示的错误(不应该经常显示错误的事实是显而易见的)。 在这里很难给出估计,我注意到一个不愉快的情况-大多数功能都可以从常规程序存储器和永久存储器中调用,并且如果第一个选项的源可以访问和验证,那么第二个则更糟-我们没有得到任何指令其来源与第一种选择不相同,因此不会有验证的问题。

3.坚实的四个文档已经成为事实,即作者没有在文档方面诉诸Doxygen的“力量和表现力”,至少给出了1分,有一个上下文链接系统,对功能原理进行了描述-我之所以没有将前五位放在首位是因为在文档方面我从不设置它,甚至我自己也没有。

4.由于缺少发达的配置,最多不超过四个,但是我已经提到了这一点。

5.很难说,我通常看一下SPI的实现-一方面,它很简单,足以理解缺乏标准rake,另一方面,它也足够复杂,可以在哪里塞满它们。 因此,在此程序包中,存在用于写入/读取字节的基准测试效率低下的过程,但是如果您深入研究,则可以使用MPD找到真正使用的选项,我对此一无所知。

关于深度的说明-它们真的很深(通过4-5个嵌套函数),我不禁提到该程序包的一个功能-它是用C语言编写的。并不是我忘记在字母后添加两个加号,这确实不存在。 对于那些在主题中的人来说,很多事情都变得很清楚了,我建议其他所有人去完成一个激动人心的任务,以确定在实现非平凡对象时在硬件级别执行的功能集。 当然,当使用类时,这样的任务变得微不足道,但这不是Ted Jedi的方式。 我了解到,对于那些忽视优点的用户来说,这是一个必要的问题,但是为什么要停在那儿,但是不幸的汇编程序用户又如何呢?

最后,我要强调的是,“这样一来,我就可以正确理解我的顶部”,我一点也不责骂MK系列,也不是开发环境,也不是软件包,我只是希望它们变得更好,更方便和对用户更具吸引力。 我在TI拥有自己的帐户,我永远不会原谅他们收购National或更早地收购Luminary,并随后杀死了一条有趣的MK线(尽管在后者的情况下,他们对自己进行了惩罚),以及他们在2014年归还给我的东西花钱买有序的水晶(尽管我绝对没碰过克里米亚),但是这种深刻的感觉并不能阻止我变得客观-他们做得很好。 题词中提出的公司提出的概念与我不太接近,但它们可能是正确的,并且没有其他方法可以处理复杂的晶体。 这是一种趋势,与之抗争没有任何意义。

而且这是趋势,事实证明了新的Vicor电源管理晶体的情况。 晶体本身很好(对于一家知名公司而言,情况恰恰相反),参数非常好,我仅在选择外部组件(特别是电感)的章节中提到了晶体。 在文档中,此部分仅一个段落,指示特定制造商的特定电感模型,并明确声明未考虑其他选项,请参见附文。 充分理解晶体发展的原因(开关频率高,电流大,在这种条件下设计电感并不是一件容易的事),但我应该指出,目前这种设计方法对我来说并不常见,``但关键是现在''。 也许您应该将这两个组件捆绑销售,那么毫无疑问。

Marleson芭蕾舞的第二部分。

好吧,现在关于该部门,该部门的用途是在TI的一个库中发现的,但并不直接适用于该公司,而是gcc编译器的一个功能。 因此,我们从地址算术领域来表述问题-我们需要计算由指向它们的指针指定的数组的两个元素(或简单地依次定位的同一类型数据)之间的索引(即索引,而不是字节)之间的差异。通常,一个元素是数组的第一个元素,但这并不重要。

任务本身很简单,在C语言中,解决方案很明显,看起来像

(pointer1pointer0)/sizeof(type)

魔鬼隐藏在实现中-部门团队尚未在常见的MK体系结构中实现标准实现,因此速度并不快。如果除数是变量,则单词根本没有好的解决方案,但是对于恒定值,存在基于乘法的选项。多亏了乘法的奇妙特性

(a+b)(c+d)=ac+ad+bc+bd

(加法是累加的,谢谢您,队长)乘法的硬件实现在实现中更为常见,并且速度非常快(硬件乘法器本身很有趣,但是现在还不行)。不幸的是,没有类似的划分属性,这就是为什么它在硬件实现方面非常少见。

因此,我们要进行乘法运算,而不是除以常数(这很重要),而要小心

a/c=a(1/c)=a(N/(Nc))=a(N/c)/N

其中N是一些附加常数。出现一个逻辑问题-什么样的垃圾,因为现在我们有两个除法运算,而不是一个,甚至乘法运算,因此我们赢了。答案是正确选择N(如果是2的幂),但是除法会导致数字向右移位,这要便宜得多,并且如果指数是8的倍数,那么除法将转换为该数字的字节重编号,这一点都不花钱。由于N / c因子是常数,因此我们预先进行计算,如果不是针对一个细节,则一切似乎都很好-该因子表示的准确性。

考虑将数字从二进制转换为十进制时发生的除以10的特定情况,然后取H = 256,我们计算乘积256/10 = 25.6的常数,并且舍入误差出现在整数25(-2.3%)或26(+1.6)上%)。然后,例如,100 * 26 = 2600 = 256 * 10 + 40,结果的最高部分是10,这对应于预期的100/10 = 10。我们可以计算出结果与正确的红利相乘多于一个的红利值,但是为此,我们必须求解以下形式的方程

[n/10]=[nk/N]+1

(括号中的数字表示四舍五入的整数部分),这不是一个很清晰的过程,因此进行数值模拟并确保结果正确到某个n会更容易。您可以输入校正添加剂并通过公式补偿精度损失

(26/2+1)/256

并大幅扩展了除数值的允许范围(最大为256,即对于8位无符号整数,我们绝不会犯错误),但我们无法消除该方法的根本缺点-存在错误,此外,我们只能得到余数的私有计算(如果存在必要,但这不是我们的情况),只能执行单独的操作,这会对工作速度产生不利影响。通常,该方法很有效,但是范围有限。

因此,当在编译的代码中(总是,多亏了godbolt的机会),我在地址算术乘法中看到某个(足够大的)常量而不是除以一个常量(很小)时,我感到有些惊讶。另一个问题是该常数与上述方法计算出的常数根本不相似。最后,结果不是工作的前半部分,而是工作的最小部分。通常,这是一个有点奇怪的方法,有些垃圾,但是计算表明它是可行的。简短的讨论揭示了秘密,该方法被证明是绝对正确的,但是...(当然,读者期望“ but ...”,因为在一般情况下不可能用乘法代替除法)他有局限性。

考虑魔术数143并检查其有趣的属性77 * 143 = 11011,最小的部分011 = 1 = 77/7。不难看出,784 * 143 = 112112,最小的部分是112 = 784/7,依此类推,对于不超过999 * 7 = 6993的所有数字。这是方法的自然局限性,但是采用另一个魔幻数字7143,我们会将可能性范围扩展到9999 * 7 = 69993。找到具有相似魔术特性的其他魔术数字并不难。

如何获得这些数字-我们想找到一个数字,将其乘以除数就可以得到包含最小结果(在本例中为7)的除法结果。这听起来很深刻,但是对于我们想要的输入数字7来说确实很简单得到xxx001,假设xxx = 001,这就是简单的街头魔术1001/7 = 143。显然,143 * 7 = 1001,那么对于任何数= n * 7,(n * 7)* 143 = n *(7 * 143)= n * 1001为真,结果的下半部分为n,依此类推。

现在,我们看到了该方法的一个根本缺点-它仅适用于除数的倍数,并且在所有其他情况下都给出完全不可预测的(从某种意义上讲,不对应于除法)。但是对于此特定应用程序,当我们减去数组元素的地址时,结果将恰好是数组元素大小的倍数,并且我们有权使用此方法。如果我们输入错误的数字,那么除法的结果也不应该引起我们的兴趣,“机器就是磨机,如果向它扔石头,面粉将无法工作。”

寻找除7以外的除数的幻数以及它们存在的证明,我们留给好奇的读者。构造取决于除数的因子图并查看其上的谷值和峰值也很有趣,可能它们的存在与数论有某种联系。例如,对于复合材料21 = 3 * 7,此数字= 381(当然,最小数字,其余数字对我们而言并不重要)明显小于乘积667 * 143 = 95381,而且即使我不敢想像,它也不是倍数,尽管381 = 381。

另一个有趣的事实是,魔幻数字在不同的数字系统中会有所不同。例如,在十进制系统中,没有常数可以除以5,因为x ... 1形式的任何数字都不能以5作为其除数,并且我们的方法不起作用。但是,与此同时,在二进制(十六进制)系统中,此问题得以解决,因为1024 + 1 = 1025 = 0x401被5很好地除以结果205 = 0xCD,并且我们的算法再次起作用,例如130 * 205 = 0x82 * 0xCD = 0xFAFA => FA = 26 = 130/5。而且,可以证明(好吧,我认为是),现在对于任何奇数除数都解决了寻找因子的问题,甚至任何偶数都变成了具有有限移位数的奇数除数(我肯定可以证明这一点)。就二进制表示形式的方便和实用而言,我们很幸运。

PS。我的普通读者(我希望自己能有这样的读者)感到困惑-帖子已经结束,“雅罗斯拉夫纳的哭声”在哪里。亲爱的,别担心,他在那里。

在CC1350和CC1352的调试板中,使用了一个天线开关晶体(以不同的方式使用,但没关系),即XMSSJE3G0PA(不要尝试用俄语抄写阅读此内容,我相信muRata不会有这种想法)。因此,具有适度特性的开关-高达2.7 GHz的频带,直通衰减-0.28 dB,隔离衰减-33 dB,开关功率-20 dB。但是,尽管应用了“绝缘体上硅”和“砷化镓”等技术,但这两个参数可以通过两个参数进行补偿-尺寸1.5 * 1.5mm和成本-$ 0.9。

他们是如何做到的-我主要是在谈论价格,其次-我们为什么不这样做-问题是修辞

Source: https://habr.com/ru/post/zh-CN430732/


All Articles