打印

为什么使用屏蔽中断指令还能产生中断__set_PRIMASK(1)

[复制链接]
18783|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liulangmao|  楼主 | 2013-4-27 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、我使用了__set_PRIMASK(1) 来屏蔽除NMI和fault以外的所有中断,但是现在用仿真器调试发现,还是有进中断的情况,(串口发送完成中断)

2、还有一个问题就是

index=SCH_Add_Task(CH340_Dispose,0,50);
        index=SCH_Add_Task(SIM900_Dispose,1,50);
        index=SCH_Add_Task(HC595_WriteChar,10,2);
        index=SCH_Add_Task(I2C_UpdataTask,3,500);
        index=SCH_Add_Task(KEY_UpdataTask,1,100);
        i=index;

仿真上面这段代码的时候,locals窗口不能显示出index和i的值,莫名其妙的问题,

3、重装keilMDK的时候不管用什么版本的安装文件,在运行安装文件时总是提示 cannot load license.rtf
我有点怀疑是MDK的问题了,

4、有时候我定义了变量,并且这个变量在程序中是左值,但是build程序的时候还是现实警告,“定义了xxx变量,但从没有使用” 这几天都快郁闷了。

求大侠指点。
沙发
杨爱林林| | 2013-4-27 10:44 | 只看该作者
2 换成全局变量试试
4 左值  就是没有referenced   右值就没有警告了

使用特权

评论回复
板凳
liulangmao|  楼主 | 2013-4-27 11:11 | 只看该作者
杨爱林林 发表于 2013-4-27 10:44
2 换成全局变量试试
4 左值  就是没有referenced   右值就没有警告了

换成全局变量就好了,难道是踩内存了?不应该啊,编译器的问题吗?

能详细讲下这是什么原因吗?

使用特权

评论回复
地板
杨爱林林| | 2013-4-27 11:18 | 只看该作者
liulangmao 发表于 2013-4-27 11:11
换成全局变量就好了,难道是踩内存了?不应该啊,编译器的问题吗?

能详细讲下这是什么原因吗? ...

我也解释不好(⊙o⊙)…

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
liulangmao + 1 很给力!
5
liulangmao|  楼主 | 2013-4-27 11:36 | 只看该作者
杨爱林林 发表于 2013-4-27 11:18
我也解释不好(⊙o⊙)…

还有一个问题,

在一个函数内部我定义了一个内部数组 uint8_t buf[512]; 用来读取SD卡的一个扇区,读出扇区内容后把数据发送到串口发送缓冲区,以后就没再使用这个数组。
现在的问题是如果我把这个函数定义成内部变量 如uint8_t buf[512];运行程序就会进到void HardFault_Handler(void)异常里去,如果定义成 static uint8_t buf[512]; 程序能够正常执行。这种问题怎么解释啊?

使用特权

评论回复
6
杨爱林林| | 2013-4-27 12:25 | 只看该作者
在函数内部定义static 类型的的局部变量  那么当该函数执行结束后 此变量的内存空间不释放  
这就是用与不用staic的区别   
你的参数是怎么传递的啊
还有
接收缓冲区  最好用全局数组  

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
liulangmao + 1 结贴了多谢了。
7
liulangmao|  楼主 | 2013-4-27 12:54 | 只看该作者
杨爱林林 发表于 2013-4-27 12:25
在函数内部定义static 类型的的局部变量  那么当该函数执行结束后 此变量的内存空间不释放  
这就是用与不 ...

buf[512]只是内部调用,并没有参与参数传递的任务。

贴一段代码
void SD_ReadDisk(uint32_t sector)
{
        uint8_t retry;
        uint16_t i;
        uint8_t buf[512]={0};
        if(SD_SendCmd(CMD17,sector,0X01)==0x00)
        {
                retry=0XFF;
                while(retry--)
                {
                        if(0xfe == SD_SendData(0xff))
                        break;       
                }  //等待数据令牌
                if(retry != 0)
                {
                        for(i=0;i<512;i++)
                        buf[i]=SD_SendData(0Xff);
                        SD_SendData(0xff);
                        SD_SendData(0xff);//伪CRC校验
                        /*----------先发高地址的数据---一字节内小端模式-------------*/
                        for(i=0;i<512;i++)
                        ADD_QUEUE_DATA(CH340_SendQueue,buf[i]);
                }                                       
        }                       
}

使用特权

评论回复
8
jackghl| | 2014-5-30 11:41 | 只看该作者
Stack_Size 估计不够512BYTE这么大.

使用特权

评论回复
9
zp1136654074| | 2016-1-20 16:47 | 只看该作者
liulangmao 发表于 2013-4-27 11:36
还有一个问题,

在一个函数内部我定义了一个内部数组 uint8_t buf[512]; 用来读取SD卡的一个扇区,读出 ...

512太大了,申请不到这么大的内存

使用特权

评论回复
10
Lkingz| | 2016-4-28 12:11 | 只看该作者
locals窗口不能显示出index和i的值,莫名其妙的问题,......
这是由于编译器优化了,可以把index和i的定义前加volatile来禁止被优化,或者改为全局变量也不会被优化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

53

帖子

0

粉丝