导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[转帖]如何在XMOS禁用编译器不相交性检查变量[liufengzhong]

 *第48019篇: [转帖]如何在XMOS禁用编译器不相交性检查变量

  
楼 主:liufengzhong 2014年8月30日18:34
 [转帖]如何在XMOS禁用编译器不相交性检查变量
我想运行键盘,并使用任务通信显示并行。无论是键盘和显示器沟通,XMOS与I2C协议。所以根据平行线的规则,我们不能够在键盘和显示器的两个线程使用I2C端口。所以我想禁用编译器的不相交规则检查。可以吗?如果是的话怎么办?如果没有,请告诉我另一种方式...


回答:

总之,你无法禁用编译器脱节检查用一个开关。解决他们的大多数方法,,经常使用内联汇编器或移动到C,但你很快会得到一个很大的麻烦,当你解决并行使用/脱节检查。所以不建议,除非你喜欢裸机,知道内而外的架构!

有达到你想要的更安全合理的方式。例如,有一个“共享”的I2C元件可在这里,适用于相同的tile中不同的内核访问单个I2C主机。 

它使用硬件锁来保护访问I2C端口,以确保您永远不会有冲突时,两个不同的内核正试图获得访问权限。如果I2C已经忙,其他的任务等待,直到它是空闲的的。它基本上是一个C包装与调用I2C简单的锁码。

有很多其他的方法来安全地做到这一点,甚至可以穿过tile(如果你有一个多tile的系统)通过使用接口,工具13功能..

但是,如果你是在一个单一的tile,我建议用module_i2c_shared开始

回复;

谢谢您的回答,但我有一个XK 1A发展节板。我会尝试所有的I2C模块从github上像i2c_master,i2c_simple,i2c_singlePort但他们没有工作,甚至单键盘或单一显示。于是我想,是由于在网站中的XK 1A项目温度计的代码。温度计给出了I2C代码工作。我修改温度计代码为我的应用程序和它的工作。但我想运行键盘的两个线程,并行显示。所以现在帮我,我怎么能使用共享I2C端口。

回答:

如果您使用的是XK-1A那么这个共享的I 2 C成分是完美的,因为你有一个单一的tile。

我不知道为什么github上的I2C模块不工作 - 它们被广泛应用于我们的refernce设计和客户,所以都核实工作。

所以,你可以:

- 了解为什么XMOS的IP没有工作(带瞄准镜检查端口和看到,如果你看到正常的I2C活动),然后用module_i2c_shared

- 以module_i2c_shared包装,并把它应用到你确实有工作I2C模块。 

- 制定自己的协议传递两个核心之间通过I2C拥有令牌(确保相互排斥),使用信道。

任何一种方式将实现你想要什么,尽管我reccomend第一的最少的努力 - 有注定是一个简单的道理,为什么I2C如预期没有工作。也许,如果你被卡住,发布您的代码在论坛上。


回复:

#include   <stdio.h>  
#include   <xs1.h>  
#include   <print.h>  
#include "i2c.h"
 
struct r_i2c i2cPorts = {
    XS1_PORT_1F,                                //SCL
    XS1_PORT_1E,                                //SDA
};
//::
 
port p32a = XS1_PORT_32A;
unsigned  Digits[32]={0xAF,0x28,0x9D,0xBC,0x3A,0xB6,0xB7,0x2C,0xBF,0xBE,0x3F,0xB3,0x87,0xB9,0x97,0x17,
                      0xEF,0x68,0xDD,0xFC,0x7A,0xF6,0xF7,0x6C,0xFF,0xFE,0x7F,0xF3,0xC7,0xF9,0xD7,0x57};       // 1 logic
 
// We do not really need to init - this part resets the codec on the test
// board instead, but it shouldn't go into the documentation.
 
#define i2c_master_init xxx
 
void i2c_master_init(struct r_i2c &x) {
    timer t; int time;
 
//    p32a   <: 0;
    i2cPorts.scl  <:0;
    i2cPorts.sda  <:0;
    t :>   time;
    t when timerafter(time+1000) :>   void;
//    p32a   <: ~0;
    i2cPorts.scl  <:1;
    i2cPorts.sda  <:1;
}
 
//::main program
int main(void) {
    unsigned char data[10];
 
//    i2c_master_init(i2cPorts);
    data[0] = 0x17;
    if(i2c_master_write_reg(0x72, 0x00, data, 1, i2cPorts)!=0){
        printstrln("failed");
    }
    else{
        printstrln("pass 47");        // just to check the acknowledgemet
    }
    data[0] = Digits[0];
    i2c_master_write_reg(0x72, 0x01, data, 1, i2cPorts);
    i2c_master_write_reg(0x72, 0x02, data, 1, i2cPorts);
    i2c_master_write_reg(0x72, 0x03, data, 1, i2cPorts);
    i2c_master_write_reg(0x72, 0x04, data, 1, i2cPorts);
//    printf("0x%02x (should be 0x12)\n", data[0]);
 
    printstrln("Ready");
    while(1);
    return 0;
}

嗨,上面的代码是我的示例代码来测试模块i2c_simple。0x72是我的I2C从设备(SAA 1064-七段显示器,4位)的地址。0x00,0x01,0x02,0x03和0x04访问的设备的内部寄存器。我想显示屏幕上dipslay 0000。现在看到的代码,并请告诉我什么是错的,这是行不通的。此外,如果我改变设备的地址从0x72到任何地址它给了我肯定的确认。为什么呢? 


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[转帖]如何指定Makefile中的优化选项?

[下一篇主题]:[转帖]从ADCs读取