-
本帖最后由 CrazyTT 于 2024-7-16 15:04 编辑
我靠,大家的答案竟然出奇的一致。
首先看你用的是什么处理器,其次还要看你使用的什么工具链。
因为汇编的指令以及指令格式在不同的架构是不同的,所以要看你用什么处理器。
因为不同的工具链,汇编文件的格式也会存在差异,所以还要看你用什么工具链。
我觉得从单片机的启动那儿看,一般的单片机启动时用的汇编来操作。
-
工具链配置错误了吧,注意点点armcc与armclang工具链的配置
下面编译用的是armclang,--no-multibyte-chars是armcc的参数;
-
C的线程进程网络这些高级一点东西学下,然后用起来,用这些做一些小工具之类的
-
本帖最后由 CrazyTT 于 2024-5-15 18:18 编辑
一沙一世 发表于 2024-4-25 23:02 谢谢,为什么提升 c 和 0XF0不都是 单字节的数据吗
0xF0就是单字节数据这个认为是错误的,不能看到数据的大小就猜想它是什么样的数据,这个是要看编译器的,对编译器而言,这种数据都会作为int型来处理;这里面的0xF0与4都是int的类型
-
我个人觉得,影响系统实时性的主要因素不在于你使用了C语言还是汇编语言。
不是说汇编写的程序就实时性高;实时性跟你所使用的硬件平台,以及所使用的操作系统这些都有关系;如果你是裸机程序,你的一些中断操作都可能会影响系统的实时性。
现在基本都不使用汇编写了,你能保证你用汇编写的代码会比C编译器优化后的效率高吗。
-
不管是r0603,还是c0603,都属于是0603,只是大家改了被名字这么叫,好区分;例如给3D封装的时候,电阻和电容的效果可以做得不一样
-
QWE4562009 发表于 2024-3-22 13:38
为啥在其他的电脑能够烧录呢
如果其他电脑可以,可以看看JFlash(GDBServer)的版本是不是存在区别,尽量使用相同版本,还有就是有没有使用不同的烧写算法
-
还有你这个代码在编译时,应该会报警告信息,提示你anjian(void)这个函数缺少return;你可以详细去找一找,编译时的警告最好不要放过,要确定为什么会出现这个警告,明确这个警告会不会对你的代码逻辑产生影响。
-
本帖最后由 CrazyTT 于 2024-3-22 14:33 编辑
你想问的那个问题总结就是,anjian(void)这个函数的逻辑上还存在缺陷,语法上也有问题,缺少 a!=b 这一种情况的返回,导致在按键按下或者松开时,anjian(void)函数的返回值是不确定的,你的这个代码中这个不确定的返回值可能就刚好受 b=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12); 这句语句的影响。
如果按键按下后是低电平,松开后是高电平;
当按键按下时,HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)返回0赋值给b,由于此时a与b不同,anjian(void)没有return语句,这个0同时作为了anjian(void)的返回值,也就满足了anjian()==0,所以return 1; anjian()==0时是按下时响应;
当按键松开时,HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)返回1赋值给b,由于此时a与b不同,anjian(void)没有return语句,这个1同时作为了anjian(void)的返回值,也就满足了anjian()==1,所以return 0; anjian()==1时是松开时响应;
没有按键动作的时候,是通过if(a==b)这儿return返回的,return的是多少anjian()就等于多少。
总结一下就是,函数的逻辑要写全,需要返回值的函数,一定要显示的return,不能想当然,一定要按照规范来,不然编译器也不知道你到底想做什么。
-
以下是个人觉得,详细原因写在后面的,你的可以慢慢看。
看了你的代码,你想通过在两个时刻获取到的电平不同来判断是否有按键按下,但是你的代码里面存在很严重的问题,就anjian()这个函数当中,你只做出了按键值相同时return 1,但你对于按键值不同的情况并未返回;
这就会导致一个问题,anjian()函数在按键值(a与b)不同的时候,函数的返回值到底是什么,你想的应该是0,因为你后面判断anjian()==0;但实际上这个值并不是这样的,下面就来具体说明;
在通常的arm架构芯片当中,会以寄存器r0来作为函数返回值使用,对于return 1; anjian()==0这种情况,当按键没按下时,函数使用return 1返回,这是r0就是1,当按键按下时,函数不再是return 1返回,这时的函数没有显示的return语句,r0的值未知,可能是0,也可能不是,可能你的刚好是0,所以anjian()==0成立,就有了动作;
改成 return 0; anjian()==1时也是同理,当按键保持按下时,读到的按键值a与b的相同,使用return 0返回,这时anjian()==1不成立;当按键松开时,此时的函数返回没有使用return,r0的值就是未知的,你的可能刚好r0=1,所以anjian()==1成立,就有了动作。
如果你想问为什么这么巧合,r0前面那个就是0,后面这个就变成了1;这我想说,这涉及到编译器和处理器架构的知识,如果你完全遵循C语言的规范进行C代码开发,这些问题基本不会遇到,后面的你可以当听个笑话。
可能是受到b=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12);这句的影响,这里面可能涉及到函数返回这些,可能就修改了r0的值。
如果按下后引脚电平是低,HAL_GPIO_ReadPin就会返回0,这句就会为b赋值为0,就可能r0的值会是0,当按键按下后anjian()==0就成立了;
改成return 0; anjian()==1后,这时,b=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12)这句,HAL_GPIO_ReadPin返回1,b就会赋值成1,这时r0可能是1,所以anjian()==1就成立了
代码不止给机器用,也是给人看的,编写代码时要做到相应的规范,该写详细的地方就写详细一点,该打的括号就打上,虽然有些地方省了语法上没什么问题,但对于维护和使用代码的来说,可能带来一些麻烦。
-
lugl4313820 发表于 2024-3-20 10:03
这几天在看ARM-CORTEX M0权威,也有看到AC6的知识,可能AC5要被替换了。
不是可能,是已经在替换了
-
bobde163 发表于 2024-3-19 08:47
我同事在使用AC6编译器之后遇到了一些奇怪的问题,有些问题的现象跟文中的描述还是有关联,那既然AC5迁移到 ...
会发现AC6更GCC的有些内容会相似了
-
无论是晶振还是什么时钟,都会有误差
-
或者读取 0x1FFFF7E0 看看低16位是多大,低16位是指示的主flash的大小
-
用JFlash把闪存擦一下试试,或者换个板子试一试
-
没注意这都是08年的帖子了,不知现在如何
-
wangzelin311 发表于 2008-10-21 17:35
感謝各位的回復
我想請教的是,以我的基礎,學習嵌入式開發大約要多長時間可以入門.
要如何做才能取 ...
嵌入式的范围比较大,工作不一定就需要对硬件有多了解;入门可能用不了多长时间,但要想未来好发展要看的、要学的和要做的东西还是很多。