OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5750|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* u' X2 \* R4 Q. ], d9 A' R
4 J2 f  K3 t0 M1 }9 V* ?0 t& }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 s, D( [+ D" x
#include <unistd.h>& ?: L# H) P- r
#include <sys/mman.h>2 f. t) }! j2 n) _6 h1 Q
#include <sys/types.h>8 F5 s1 Z7 k' X
#include <fcntl.h>4 C. i/ `9 F: u& l7 G3 J$ s

. u! f, w+ G- [, w6 `#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 r9 q! g$ j0 {4 c0 m, o! e

+ j5 I8 P4 M& I: e, p& _typedef struct. W! W9 G, B" {- }; L$ ]/ a
{
- ~$ B! r/ g# h) d; `        unsigned int a;, r$ W( N, p" z$ m! `, J
        unsigned int b;- E8 a  Y2 m$ O* |1 ]6 A5 Z+ j
        unsigned int packet_cout;/ u% a! ?! K% Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 \$ s7 N( ?( W$ l

4 P4 k. t$ P- q8 j, E3 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; U: L7 a2 h4 Hunsigned int count_copy = 0;
4 J; _. Y7 ^7 R4 E
, V+ o- v# o0 m! Z& M. X$ L' A4 j8 I" Z
int main()* f0 |7 T) _. J/ U
{$ u! D1 R7 F4 X2 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% r0 r7 f; {" U: ?, K( x" F" B0 z& W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# I! k+ _" A7 f  O& c

. Z9 Y$ X) h/ @: I+ a* T        while(1)8 p6 M) y* f* H+ {3 _
        {3 B3 ?2 N; m4 Y; p( P9 W4 `
                read_MSG_buffer(pshreRAM);* B4 O0 d5 P8 ]
        }                  X5 R* W* S3 L, i# _, a6 G
}
3 j$ p$ [1 i% o/ i2 v
$ t+ \6 `' z3 z, z  Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( X& I* t1 n  Y{
( G2 A1 ^6 n; p; e4 q        RX_MSG_PROTOCOL buf;+ ?1 }% Q- a* }6 N* w
        - G9 R, n, ~+ z. H' |+ {+ P  N
        buf.a = pshreRAM->a;
& G4 }1 T* k+ k, I$ j        buf.b = pshreRAM->b;
* z- J! R) ?8 s1 b. G, j" n1 G6 q4 N        buf.packet_cout = pshreRAM->packet_cout;
2 o. i9 u- `8 S% Q: l+ K; C        . o3 v. T0 t6 b3 k
        if(buf.packet_cout != count_copy), ]  p# K2 V0 D) F. N
        {, m3 O5 f  S# L5 B- a0 m& [/ z( X
                printf("a is %d\n", buf.a);
5 ^+ i# z8 K) H$ \                printf("b is %d\n", buf.b);0 f( G& O4 a: M' Y: g1 `
                printf("count is %d\n", buf.packet_cout);
0 Z' H6 O* o, E: ^2 G                count_copy = buf.packet_cout;, M  @/ J; u. c* b$ ]& G
        }1 F8 H. x5 `. c6 C; S7 }) R
        else
1 @/ `6 c* F! c9 U        {
' Y" q* m7 R/ _, U7 a                printf("No effective message!");; C1 Z# K5 g9 j2 k" ^! V4 [. B7 K
        }8 G2 O3 S6 f/ T5 j0 W
}
5 i; H+ U4 `4 O3 W
0 |" J9 A0 F: m6 P: s4 r
. x, m/ @3 A; R1 L$ h但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ `# D7 l# ^9 S% o6 r0 a使用下面代码,对内存使用了mmap函数后:4 Y2 h8 j/ u  L
#include <stdio.h>' G# t/ ?2 O$ E! j
#include <unistd.h>
7 G2 ]4 ~- K6 F#include <sys/mman.h>
1 w* O7 D# s8 p! E/ W#include <sys/types.h>  i  h( w3 x! l: R; v1 x
#include <fcntl.h>
0 h( S! C2 ?- g$ K6 ?" S6 T+ R
6 r) w& B/ ^) x9 t( i4 F5 N: Z#define SHAER_RAM_BASE_ADDR    (0x80000000)
" c& [1 o; U3 e; d4 O- d#define SHAER_RAM_SIZE         (0x20000)   
& b- ], Z3 p/ n$ ^' W1 r$ f+ H2 P# p+ V1 ~, w. X/ \1 c
typedef struct
% M5 b1 }  R- ~4 N0 y{7 M1 |: o7 L" K( S  n# O% @6 o) J
        unsigned int a;7 ?4 Q) i  T# L+ i. Q% w
        unsigned int b;! p/ S) @) b, ], D. H" B5 i! I
        unsigned int packet_cout;
. w9 D8 a1 X% ]# w3 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& m8 t  U5 L# P) o% A
( J  @/ ]: L/ z9 K; o( R- Z& m
void read_MSG_buffer(int *baseaddr);1 P/ E& o) ^7 b1 Q7 g6 T/ z; }
unsigned int count_copy = 0;+ k4 [: ~$ m$ s- ~# v0 L
, o1 u7 ^8 H% ]
int main()( t: P, r9 F8 C
{
/ e7 y4 U9 D* `) C" D        int fd;9 t; l# y( C/ I! n: `, Q
        int *mem = NULL;
; @5 L' _# w, e" b) R3 M/ q' \) O
% P( V2 K  \6 Q/ Z# z7 q9 U3 F        if((fd = open("/dev/mem", O_RDWR)) <0)
# ]$ D, o$ D1 w0 B( ?% j        {
, L/ K, a8 D: a/ S  \& T: O                perror("open error");. m, `6 B8 G* C$ w. n/ w  n
                return -1;% W+ n1 u* D0 f8 n* Q
        }
% D. B: S1 v2 z$ Y; p9 b        ' ~0 u0 ^: t0 w* `9 r/ W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# ^0 e9 |; A1 P6 u. {, O" ]" w7 M8 L' ]
        while(1)" H  u- R, T( }0 \6 x3 d( u6 g. B
        {( q8 W% t# o+ a6 X* y  B
                read_MSG_buffer(mem);1 t8 Q1 V0 B/ M; r
        }                ; a1 d+ Q8 g; e, Q" n
}# ~2 U9 U4 j$ Y- J* C

. X5 M2 g/ m, a* i9 nvoid read_MSG_buffer(int *baseaddr)
/ P. X5 e6 l$ G& @{* {: g5 K7 N# t# T: W
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ J* \% \. s0 S0 N
. N5 V4 c9 i2 ?0 R
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ E4 w. j  s. w! J

1 w( d! q0 Z! C: C; n0 Z        if(pshreRAM->packet_cout != count_copy)
2 f8 y/ Q( t' N2 j" N( g        {
, a: e/ \5 F$ [2 @" @1 b                printf("a is %d\n", pshreRAM->a);
/ w7 l1 V+ I9 z, ^. R1 |                printf("b is %d\n", pshreRAM->b);
& d3 I7 p9 T. ~8 L9 u                printf("count is %d\n", pshreRAM->packet_cout);1 q$ d: X% r& g' ]. J8 C: w
                count_copy = pshreRAM->packet_cout;
# C. N3 I7 T, C) a# F2 w; d; i        }& }  F/ g& X+ y  ^2 o! _' n- s2 M
        else
0 U; ]- t+ t* j- p) x        {8 M; E+ \4 B6 i( N7 x& f& j8 G
                printf("No effective message!\n");* I, v, |4 N8 q9 B* I) g
        }; I6 G9 x% d$ E' [
}
+ I& F* d# V( d& n, f
7 {! X" e2 l. X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# D& O: E1 P* l0 Y; g2 Q
6 t8 Q$ R, q8 E( S: q) C9 D- t, D
5 a$ D1 s& R9 b* Z9 {1 [1 x4 o7 E
5 X0 w  Y, d1 _7 s1 R, Q$ I! q) ?0 x8 B5 k0 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-18 19:36 , Processed in 0.042451 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表