stm32是怎么获取堆和栈大小的+ucos iii

stm32是怎么获取堆和栈大小的+ucos iii,第1张

平台:stm32f103zet6

flash:内置512K(大容量)

sram:内置64K+外部512K

启动文件:startup_stm32f10x_hdc

链接脚本:stm32f10x_flash_extsramld

1、没用ucos iii之前是可以正常运行的,

2、用了ucos iii之后不能正常运行,

ucosiii是能在KEIL UV4上成功运行的,初步怀疑是堆和栈的分配有问题(因为ucosiii中要用malloc动态分配内存),所以我想知道stm32是如何获取堆和栈的信息的,我怎么才能让它知道堆和栈的大小以及地址空间。

补充:栈的最高地址可以通过启动文件的下面部分知道,即stm32启动之后先要从flash的起始处取出栈的最高地址和复位向量,那堆是怎么知道的呢,我不知道IDE在这方面是怎么处理的,我想充分利用内置64K+外部512K的SRAM,不知道怎么做,谢谢

void ( const g_pfnVectors[])(void) =

{

(void )Initial_spTop, / The initial stack pointer /

Reset_Handler, / Reset Handler /

NMI_Handler, / NMI Handler /

HardFault_Handler, / Hard Fault Handler /

}

假设你要读取的数据位于Flash地址0x08001000处,使用如下代码读取:

数据为8位:  char val=((volatile char )(0x08001000));

数据为16位:short val=((volatile short )(0x08001000));

数据为32位:int val=((volatile int )(0x08001000));

读取数据的本质是将绝对地址转化为相应指针,然后取指针指向位置的数据。

STM32每一个芯片内部都有一个唯一的96位的ID号,可以通关过以下方式进行读取:

由于唯一ID是一个96位的数据,所以你要创建3个32位变量用于存储ID号

static u32 CpuID[3];

接着执行读取函:

void GetLockCode(void)

{

//获取CPU唯一ID

CpuID[0]=(vu32)(0x1ffff7e8);

CpuID[1]=(vu32)(0x1ffff7ec);

CpuID[2]=(vu32)(0x1ffff7f0);

}

数就可以了。

把自己写的html网页加到工程中有两种方式:

1

你系统已经移植了文件系统,那么PC端编辑好的html文件就可以直接存放在SD卡之类的地方然后STM32通过文件系统的API读出html文件。web端只负责把这个文件读出,送到客户端。客户端的浏览器会负责解析。

2

另外一种就是没文件系统,那么你只能把html文件转成二进制数据存入内部的FLASH或者是SD之类的存储器介质中。然后按照事先制定的规约读取发送给客户端

我就直接用注释的方式写了

void KEY_get(void)

{

unsigned char i;

unsigned int temp;

temp =  ~((GPIOA->IDR & 0x8000) | ((GPIOC->IDR & 0x1C00) << 2) | ((GPIOB->IDR & 0x300) << 2) 

          | ((GPIOB->IDR & 0x30) << 4) | (GPIOD->IDR & 0xff));

          //上面是获取ABCD四个IO口对应管脚的输入情况,就是确认那些脚是不是输入模式

for(i=0;i<16;i++)

    {  

    if( temp & key_list[i] )//与key_list里面的值对照,找到匹配的脚进入if

        {   

        if(key_time[i]==3) //这个是按下时间的判断

            {

            key_short |= key_list[i]; //key_list[i]对应的这个按键被短按

            }

        if(key_time[i]>651) key_long |= key_list[i];//key_list[i]对应的这个按键被长按

        else key_time[i]++;//按键计时,来确定按了多久

            //如果按键释放了,就退出if( temp & key_list[i] ),

            //如果时间短的话可能只是执行了if(key_time[i]==3),

            //而if(key_time[i]>651)就不满足就不能执行

        }

    else    //如果没有找到匹配的按键就执行下面代码(因为这个else是和if( temp & key_list[i] )匹配的)

        {

        key_time[i] = 0;//按键计时清零

        key_short &= ~key_list[i];//清除key_list[i]短按状态

        key_long &= ~key_list[i];//清除key_list[i]长按状态

        }

    }

}

最后应该还有一个程序来读取key_short和key_long来确定按键的状态吧

以上就是关于stm32是怎么获取堆和栈大小的+ucos iii全部的内容,包括:stm32是怎么获取堆和栈大小的+ucos iii、如何读取stm32 flash里面的内容、如何获得stm32 cpu的唯一ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9635885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存