说明
我的第一个项目是stm8。
显示部分是点阵加数码管,通过串口控制下位机变频器的运行。虽然看起来很简单,但是项目复杂度超过我以前开发板上的所有项目,因此碰到了很多前所未有的问题。在此记录一笔。
注,这是本人第一个项目的记录,不保证科学与正确
1,misplaced local declaration错误
变量必须在函数的最开始处一口气全部声明或者定义掉
这其实是说明cosmic不支持c99的原因。
2,stm8中,各数据类型长度
类型 | 长度 |
---|---|
char | 1字节8bit |
int | 2字节16bit |
short int | 2字节16bit |
float | 4字节32bit |
double | 4字节32bit |
long int | 4字节32bit |
long long int | 4字节32bit |
为了以后移植方便,我决定采用C99的扩展类型uint8_t uint16_t这种。
3,STVD的中断中不能使用long类型
小标题只是该bug的表现之一。确切的bug描述是
在stm8_interrupt_vector.c使用超过2byte的类型。就会产生类似段重合之类的错误。
下面是bug的详细描述。
3.1。
在stm8_interrupt_vector.c中,函数定义里的变量不能超过2个byte。这个函数不仅仅是中断处理函数,还包括放在这个文件中的普通函数,这个变量限制对全局变量局部变量同样有效。
3.2。
同样,在这个文件中的变量默认是signed类型,就算在使用前声明为extern unsiged也不行,但是在使用中进行强制类型转换(unsigned int )或者数字后面加u是可行的。
这句话的意思是比如声明变量的时候为unsiged int,那么理论上的变量范围是0~65535。而stm8的int类型是2byte,理论上是不会报错的。
但是实际上,如果变量使用的时候超过了32768。那么就会报错。即变量在使用过程中如果超过了有符号类型的最大值,那么编译器就会进行扩展成4byte。
这种bug,即使在使用文件前extern一下也是不行的。
但是,如果在使用中,再进行一次强制类型转换(unsigned int)或者数字后面加个u