Beispiel #1
0
STATIC mp_obj_t stm_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
    // TODO support slice index to read/write multiple values at once
    stm_mem_obj_t *self = self_in;
    if (value == MP_OBJ_NULL) {
        // delete
        return MP_OBJ_NULL; // op not supported
    } else if (value == MP_OBJ_SENTINEL) {
        // load
        uint32_t addr = get_read_addr(index, self->elem_size);
        uint32_t val;
        switch (self->elem_size) {
            case 1: val = (*(uint8_t*)addr); break;
            case 2: val = (*(uint16_t*)addr); break;
            default: val = (*(uint32_t*)addr); break;
        }
        return mp_obj_new_int(val);
    } else {
        // store
        uint32_t addr = get_write_addr(index, self->elem_size);
        uint32_t val = mp_obj_get_int(value);
        switch (self->elem_size) {
            case 1: (*(uint8_t*)addr) = val; break;
            case 2: (*(uint16_t*)addr) = val; break;
            default: (*(uint32_t*)addr) = val; break;
        }
        return mp_const_none;
    }
}
int
main(int argc, char *argv[])
{
    int	    dfd = -1;
    int	    ret = 0, read_bit;
    long    read_addr = 0, slope, normalized = 0;
    long    base_avg_slope, base_std_dev, curr, prev= -1;
    long    mean_age = 0;

    if(argc < 2)
    {
	    printf("Usage : listener <drive-for-communication>\n");
	    return -1;
    }


    dfd = open(argv[1], O_RDWR);
    if(dfd == -1)
    {
	    perror("open");
	    return -1;
    }

    /* This is the read address that is used for entire session */
    read_addr  = get_read_addr(dfd);
    debug("Read addr : %ld\n", read_addr);
    
    printf("Creating baseline parameters for read bit detection ...\n");
    printf("Please wait ...\n");
    get_baseline_results(dfd, read_addr, &base_std_dev, &base_avg_slope);
    
    printf("----------------- BASELINE PARAMETERS ------------------\n");
    printf("std_dev        :       %ld\n", base_std_dev);
    printf("avg_slope      :       %ld\n", base_avg_slope);

    //synchronize();
    mean_age = time(NULL);
    while(1)
    {
#if 0
	if( time(NULL) > (mean_age + MAXIMUM_MEAN_AGE) )
	{
	    //read_addr  = get_read_addr(dfd);
	    //debug("Read addr : %ld\n", read_addr);

	    printf("Re-establishing baseline parameters for read bit detection ...\n");
	    printf("Please wait ...\n");
	    get_baseline_results(dfd, read_addr, &base_std_dev, &base_avg_slope);

	    printf("----------------- BASELINE PARAMETERS ------------------\n");
	    printf("std_dev        :       %ld\n", base_std_dev);
	    printf("avg_slope      :       %ld\n", base_avg_slope);

	    mean_age = time(NULL);
	}
#endif

        curr = get_mean_access_time(dfd, read_addr);
        if(prev == -1)
        {
            prev = curr;
            debug("Exiting from here ...", ""); 
            continue;
        }

        slope = curr - prev;
        normalized = normalized + slope;
        if(normalized > base_avg_slope)
            read_bit = 1;
        else
            read_bit = 0;

        prev = curr;

        //printf("curr = %12ld   slope = %12ld   normalized = %12ld   Bit detected --------> (%d)\n", 
         //        curr, slope, normalized, read_bit);
        printf("curr = %12ld   slope = %12ld   normalized = %12ld \n", 
                curr, slope, normalized);
    }

    return 0;
}