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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& P3 j. F; b& U; P/ E  `7 V; u' E* ]- a; v' `. q7 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. V$ X3 x% n' r- @
#include <unistd.h>" A5 Y1 ]/ P$ y  o0 l' G( T
#include <sys/mman.h>
1 B! l; a7 L# ]7 e6 a#include <sys/types.h>. ?$ Q4 V2 Y! P# h. I4 n" N* J
#include <fcntl.h>
" C% l: v$ g/ A4 r* F$ z
* b. M* {/ k, ?5 [  ~5 g3 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   * C6 R' c" V+ H. ?8 j

. y& |* D! x( i( a" ^+ r  ^typedef struct
4 u; `* _5 a3 p/ I{
# o! d( {( a7 O9 R3 p8 [        unsigned int a;% k$ w; ?( B* n1 I
        unsigned int b;/ E5 B: Y& j8 p5 V/ S3 u$ w
        unsigned int packet_cout;
! u/ F0 {- S' _! B: u0 W; x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w( F& _/ C, t% O' D  `- F$ C9 f9 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 N4 B$ Y: @/ k: d; \! Q  ^3 G( k( V/ vunsigned int count_copy = 0;
$ K" X( _: J* q: G  Y* P3 F9 n4 g: x3 X, s

% s% M' E+ W: ^# l! _- i- |9 S/ y3 p* [: Fint main()3 }4 B. B! ^) i# Z! P4 M7 B
{' c  t1 f( S. \  h9 t1 F
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 c2 k) `, }) ?! p  ~, O
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" R/ V# |+ v6 y$ W4 E
% N$ m  b3 z3 b
        while(1)4 f. w: J+ s9 [1 {
        {
, p* F$ y/ @( [; T, y                read_MSG_buffer(pshreRAM);
8 m* k- g+ Y* x7 j        }                7 F+ K% z" R! G4 J
}+ m% V/ O) j: u! \# {: v; L" P

7 w5 A& h. q1 Q4 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 L# X+ ^6 F+ r2 K; U7 m) ]) p{' B$ B$ Q/ y6 n# t: |+ Z( D, K% {  w
        RX_MSG_PROTOCOL buf;: r- Y, Y- t$ `+ x3 v$ `9 ?) }* a" H
        # y8 e' p  f- T7 h0 g
        buf.a = pshreRAM->a;/ x; E) j9 i! X' o- {4 ~  G
        buf.b = pshreRAM->b;
; E4 T6 J) Y' P. R        buf.packet_cout = pshreRAM->packet_cout;
8 a5 q8 a3 p4 Y* c' D& u        
8 p0 \% k# P, R- S, R        if(buf.packet_cout != count_copy)
2 I  |* r, j4 U6 \" A4 S8 B        {+ J5 T6 o6 i* a' T5 d
                printf("a is %d\n", buf.a);9 r* c8 B% z1 ^! ~
                printf("b is %d\n", buf.b);, u8 ^% L) Q% K8 f! }
                printf("count is %d\n", buf.packet_cout);# m' S0 t4 R- [3 |# J- k4 o
                count_copy = buf.packet_cout;
3 j. ]3 _' l1 x- _3 ~: s# s0 S5 {        }) p* r9 s# ?! [& a! ]
        else% f+ W' _' B# \0 W
        {
9 R! K$ _1 Q! s+ L( B- j                printf("No effective message!");
% o: s' V+ f( m% x6 D# H# U        }' i( ^4 Y9 A0 m8 \) u/ v$ I, ?
}2 U5 b1 x; a* `% \2 X5 e3 }+ N/ r

6 I3 ^/ P2 F0 u1 V9 A3 M8 _( Z
4 E8 D! i# ]- [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 Q3 Y% T1 g- h1 N9 y- R
使用下面代码,对内存使用了mmap函数后:  m, Y, `5 k* E1 d5 [
#include <stdio.h>0 T+ q- s( q1 L
#include <unistd.h>/ q% V1 b- G) K9 d
#include <sys/mman.h>
) e5 a* Y/ {* k1 O#include <sys/types.h>5 K/ x6 u, U3 J  `; i8 Q
#include <fcntl.h>( I& `& P  A+ ]  G# I7 w
9 q, N) L- d# s  A$ J& y$ w6 a
#define SHAER_RAM_BASE_ADDR    (0x80000000)- ^: f' \6 M7 l9 ?4 _) f! w0 E& `
#define SHAER_RAM_SIZE         (0x20000)   7 ^5 @0 H: P- C+ E7 \' F% u$ P
& m2 v+ O2 ~* ]5 k# Q/ G! a# l: E7 q
typedef struct
( e$ W0 r- v8 ]( ~{
/ T1 M* x$ Y( w" ^$ X; s0 Z! `        unsigned int a;+ P% B8 P* x% F3 ], O7 l
        unsigned int b;- @) D" |0 V4 [% Z
        unsigned int packet_cout;
' ^" m8 g+ I( R% v, w* A# e" e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  r/ c' b6 h! w1 d# Z8 z  C/ P) {
( a) p' _. r) T; q  W$ H% ^: kvoid read_MSG_buffer(int *baseaddr);
; ?0 C. G6 W  Y( z; s! Kunsigned int count_copy = 0;
* K( u0 B& _. D3 E9 ]5 l; b3 I
7 E2 N3 W3 a: X7 s$ g/ b0 x& Gint main()
$ X  b3 H5 M3 E{
0 }3 z/ f9 B/ V* _* t' j        int fd;
2 {9 X9 _1 v% H) u; g        int *mem = NULL;
$ J% V, m& I  h/ P  ]+ [0 K% A0 a& M% S+ _' c" o( y
        if((fd = open("/dev/mem", O_RDWR)) <0)  @: [) P: {3 f" U/ M+ B
        {
( e; U2 q, ~& k! W                perror("open error");
1 l+ G1 v2 l/ [# M& x% E                return -1;) n8 j1 p) v2 `$ ]0 v
        }( v4 e, e! v7 x( e$ l
        2 m2 q$ r3 C* h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: Z  C) U; j7 I9 j
* J) r3 C( k: E6 H" G
        while(1)
6 @2 ?4 u$ y8 C, b" O+ m        {
# Z% O2 C' \; e* d# t8 i' r/ [                read_MSG_buffer(mem);: C' E5 s6 H0 R3 Y7 ?
        }               
8 i& p# J* j$ M0 x5 e& c}1 e6 G3 P* r. t

- N- |, R9 a- @) x9 e: P. ^void read_MSG_buffer(int *baseaddr)1 c; W# l: |. H' O$ _% R+ Z  s
{+ g  i" z$ h3 r% G- G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 P( ~* V0 t1 c) [6 ^" N# ]. f: B" d/ |, o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 }& ^0 Y) M% T: |& Q: M/ h' T4 |/ n. i3 F  q0 S% v) e
        if(pshreRAM->packet_cout != count_copy)7 v- q9 `# c1 N
        {
, H# V- A+ ~. W% I" Y                printf("a is %d\n", pshreRAM->a);) A& [( @# r3 c# u5 v4 i
                printf("b is %d\n", pshreRAM->b);2 _3 L* a  k9 ~# y8 f
                printf("count is %d\n", pshreRAM->packet_cout);
4 U: s4 Y- I/ Y) S                count_copy = pshreRAM->packet_cout;
& z8 _- q# \$ J* C. ?1 x        }
# o$ K1 i, }& V# i/ y1 I! t& V* F        else
  o. m: F5 m, z2 Q        {) O& ?9 O9 S& L) \; l3 n) \
                printf("No effective message!\n");7 i! y( z9 Q5 f8 E
        }0 u- @% _+ a* C6 L
}
, H' \! v; j( z+ H* y7 o) w/ p& N- V9 \7 n# O: f& t+ H" s  `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  a+ I1 \1 Z" l# W0 w
7 N, j9 t4 ^! W! M

, x2 i3 R0 f8 t8 N
) c( I/ R0 n  f$ Z7 D6 z# t6 l5 ^, K2 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 19:52 , Processed in 0.048139 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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