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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + h% c3 [4 f, V7 q  R( ^. _( e; n
$ G* K6 r% l- J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) h$ C6 s7 x- X$ z#include <unistd.h>8 _8 r8 D) N) r! Y- n1 Q/ y5 Y
#include <sys/mman.h>2 ]3 P9 Q4 B1 T3 V
#include <sys/types.h>+ f9 I/ ?. V; T/ a
#include <fcntl.h>' H+ z) c' e- K* ~

" _0 }% M1 D' M& j' i* W6 ^+ P& S6 j#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% u. E, \7 @, |6 N3 r) S
! {- y0 E/ W4 z& ltypedef struct
: p% o9 J! O, G! M{, Y$ M3 R" l, O; p) q6 Z6 |
        unsigned int a;
, s6 G5 q' K0 b1 l        unsigned int b;, u+ m/ Z( n9 J7 P1 P
        unsigned int packet_cout;$ T- t/ l1 x, S+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- R$ K$ d+ S. d3 t" K; S
" J" I, S! J5 l7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 a. V6 D& h8 l0 Q2 H) I/ sunsigned int count_copy = 0;, l  U, P1 S2 X. Q

' g9 ?2 @* E' i! g5 A1 @% N% ~3 R7 t4 Q
int main()
8 y" X" k" Y" }' w{% w4 O9 L2 U, {* U+ [& R" @, S+ i: i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# d& r- P  [4 \* X+ `' b        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) `1 N( P2 c5 f2 r

/ q, j' n/ o5 ^' C2 D7 q% ?: [        while(1)& x. ^# q' S/ l$ f$ n5 R- y7 _
        {1 @! s. z  ^+ q4 V
                read_MSG_buffer(pshreRAM);0 ^" l. n1 f4 `$ t( n9 w& Q
        }                " T  [- t% W4 q: d; a
}
8 G/ _& }$ L- ~! e5 U+ \# Q, D3 p8 r) p& a" U; w$ h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ t- P# X/ Z( O  _/ T{7 L) X9 P( o; @, K1 N5 _
        RX_MSG_PROTOCOL buf;
4 ~$ m2 |/ s+ j9 g        ) F5 N" C+ T& Z
        buf.a = pshreRAM->a;; a5 v8 Z* W) a3 |+ B
        buf.b = pshreRAM->b;
: P# u+ Y: ?+ A. I        buf.packet_cout = pshreRAM->packet_cout;
! ]" d: t  v: G5 L# p; n/ @        
8 I) g: v: Z* g6 J, Z8 Y% k        if(buf.packet_cout != count_copy): D: f1 K% D! q0 e$ `: c% _
        {
$ {5 f0 {- O; v                printf("a is %d\n", buf.a);
! R+ @% C' [0 {7 g' D$ s* R# C5 x                printf("b is %d\n", buf.b);  C( ?: N# D1 f" |4 l  o
                printf("count is %d\n", buf.packet_cout);* X" |( U6 @; c. J$ C5 L" [
                count_copy = buf.packet_cout;
: U) l: I/ V3 A# |* O' `        }
) Z  z$ Z5 A' \- Y7 C        else) g! r4 u; O2 ?4 D, x! c, ?$ m" B8 y
        {, h3 I7 S5 Y$ m  g( _. }  Q+ m
                printf("No effective message!");
0 U* k( ~! |( J; Q* _" W        }/ k: P" x! B8 ], K" z
}" j4 U; _' b! |; @9 x

1 S: O6 V, z( y1 \/ X6 c/ f# C( G. m6 D* Q$ L/ h1 x( |- h5 w, s2 h3 e' f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 S$ P. {$ W0 n5 n7 l使用下面代码,对内存使用了mmap函数后:7 E5 J; x  Y+ e. x' u
#include <stdio.h>1 {+ d. c; `" t3 Q. |8 B! b6 Q
#include <unistd.h>. \9 u9 x. ^/ w
#include <sys/mman.h>9 r$ s  u1 Q" t$ f5 h" u& k
#include <sys/types.h>
/ ?) v; r) k0 ?2 b& B. J, L#include <fcntl.h>
5 c$ y, C4 {, \' X2 l- Y0 V: v* _$ _  Q( H! V+ R9 O1 w; H
#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ Y: u5 G; X7 Z#define SHAER_RAM_SIZE         (0x20000)   ! l  Z5 [8 f- I' M2 g: y, K; ~, k! N' _" V
2 X1 a3 N1 g, a- Q) j- B' F
typedef struct
4 s, S5 Y  w0 x4 S* G( E4 A{- @" \2 z" j& E; R- F
        unsigned int a;
. y; d/ \7 j9 U, }! R/ R7 L        unsigned int b;: P( N, d' G3 r1 @* G
        unsigned int packet_cout;" V- ~. D/ r/ j# d2 z/ w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- A) S1 w3 A: Q$ T: M# Z2 E; {, Y  y0 d+ G" _2 I9 ]
void read_MSG_buffer(int *baseaddr);
) h5 x% M. C, Y+ A: x" u& tunsigned int count_copy = 0;
% c) D3 {& Z. u  v# k2 l; ~
7 e8 O* K6 M  B0 e" X; Cint main()
# m) q/ I4 x+ @! P{
( i8 p0 B7 t) h. r: H1 U        int fd;
) M; A! \: S/ Z2 e8 m/ Y        int *mem = NULL;
8 u% D# v; A) i# ]. S* ^
) b( m5 W) w- \8 H8 J        if((fd = open("/dev/mem", O_RDWR)) <0), @( R* X  r2 M! I
        {5 |+ |0 o7 k% E& j
                perror("open error");+ B4 X( r  f+ B  O& A$ g
                return -1;
/ M: |* e! _4 }/ f# c2 ^: N: g        }; @, D5 f1 J( f5 B9 ~
        
( Y7 V' S! `/ y2 K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 s* L6 [8 e6 {0 ?+ j8 T8 j% }* V. `, [$ Q
        while(1)
$ J9 n$ {( A. \# \' D& N        {
+ L. L( k, X3 e( i3 x                read_MSG_buffer(mem);+ z/ u5 w) _% A' J
        }               
. O- o2 k8 _) Y% _4 S- R}6 f% p  ^5 `% G! l: J
/ t: U- k- q* o3 r  G
void read_MSG_buffer(int *baseaddr)
; G5 |6 v( m+ r/ q$ P{
7 ?2 S5 i. ~! y% y1 E        pRX_MSG_PROTOCOL pshreRAM = NULL;! j1 t2 s1 M" d, j+ t' B: y

# h3 o/ v2 M! s- O; S- |6 z0 x; @/ R" v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& M$ r, g; K- @6 g4 G
2 N: R! d) q6 N" w+ y        if(pshreRAM->packet_cout != count_copy)4 f; R1 F2 V3 G) m
        {5 v& h; M7 U* s: |
                printf("a is %d\n", pshreRAM->a);
' i# X" n1 z- {4 e                printf("b is %d\n", pshreRAM->b);
3 k5 f! d/ n1 }! k                printf("count is %d\n", pshreRAM->packet_cout);
$ `% ^8 T0 w2 {# T; G/ f                count_copy = pshreRAM->packet_cout;
- e* B: Y" ]  P) V& T  y        }* Z1 `+ x) ?) Y
        else1 O* v" f9 G5 Y' I# Q
        {
  L+ ^, O7 g6 l1 k. P                printf("No effective message!\n");
! y% J- v* S5 P/ ?* w        }
6 r4 [0 m2 @; u! W" g4 z: |/ q5 q, j}
8 t) t3 @' U" W2 ^3 J) P3 @' k* c5 X' ~* t- d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 W: l; U- _$ p' L0 B& a  Y
" O0 [2 @0 C6 W1 `/ L& f0 d5 }

! T& [8 A# l; y5 W" _$ L  Z$ t
: p) }2 ?8 s5 J2 d0 {3 Y, Y' f* w3 b/ Q- t' t0 d8 ]- }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-14 03:21 , Processed in 0.040746 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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