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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & M+ L& ]! K7 S/ k( h7 ~  }5 S5 s3 n7 e
  \  T$ a0 }5 ~% W) F" Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) j0 u. Z7 L- f2 T1 B) A9 W
#include <unistd.h>
, M0 p: {2 I/ B( [# Q#include <sys/mman.h>
5 A( s1 K% g& _: W#include <sys/types.h>
" B' N* {0 O3 e) p! N5 P  J#include <fcntl.h>9 K; B9 ~7 i+ j8 j+ m, i
6 \0 E( L: o; G5 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- Y1 f+ ~9 Z/ I* L7 W$ Z2 Z6 D5 b5 D5 D, D. H1 v
typedef struct
/ V8 N( [9 l! C{7 Z  H. W- Q5 i4 v' i
        unsigned int a;
5 L+ m) O' ~. n' R- R/ q        unsigned int b;3 l) l6 b3 D: `( D* e4 D" w1 M8 W
        unsigned int packet_cout;: Z' S4 E) w# j1 d' `3 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. Y, B. _6 ~" `( a% C8 O: }0 ~0 r9 p/ U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 M3 }; Q( x. l; v; _: s$ vunsigned int count_copy = 0;
9 M; b- y% l6 v. x4 U) \- [' Q: t, {! K% O; h+ x+ B

: a- u9 b, E3 V# O7 k" [  z5 ?int main()
+ `) x( ~. S$ u8 d. ?! ]{
3 v# D4 p' q' K: ]2 f        pRX_MSG_PROTOCOL pshreRAM = NULL;2 i" B! Q  a% f. l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" Q+ e. W+ B( Q7 {/ f& }
- Y) F2 b5 P2 \  R
        while(1)
2 L( g) @3 j& }) g        {
$ j# f' Y* Y" M                read_MSG_buffer(pshreRAM);9 N3 c8 J* b  q' l
        }               
0 o$ a2 `* g* _+ Q8 \# \- S  P' j" Z) a}0 ~4 E6 e* \3 u7 P
: D. y5 _0 f" w+ a, i5 D% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* _; f1 n' k2 _+ s+ u( d% H9 o
{1 I7 U- H% J+ ~  s* c9 P
        RX_MSG_PROTOCOL buf;
8 A! s  D' S+ v* L) X& j# L) D        5 W+ I! O1 ?; [$ o: x4 r0 P, `8 b
        buf.a = pshreRAM->a;
" x: @. x* H6 u& C0 U        buf.b = pshreRAM->b;
# O7 Z2 [& ^5 N/ l/ R        buf.packet_cout = pshreRAM->packet_cout;1 H5 H9 h$ w* o5 Z. P: P8 ?
        
% d3 h, v! J. J; x5 a8 Z; }        if(buf.packet_cout != count_copy)7 ^8 [6 u: I; G1 i8 B# Q
        {
6 s+ y0 z3 n& F% e! B( ^+ b1 F                printf("a is %d\n", buf.a);
. A3 h; L# s& A# ?& J" r- ]                printf("b is %d\n", buf.b);5 u+ l- b  Z0 L0 G3 k& a
                printf("count is %d\n", buf.packet_cout);
. j  r2 ]  ]9 u, ^, S" Y                count_copy = buf.packet_cout;; y: u- y+ f& U
        }( q" a4 M7 N/ f
        else3 W( k% n- P! }
        {' I, A: v: _( {5 p% h3 ^. H
                printf("No effective message!");! g& P# S! Z: N* s: ^- J
        }. A5 @2 d/ C1 }( Y( O
}  i9 _1 B9 L6 L% U+ s; Y

9 t9 w, v" R$ g5 a# ]+ F; f, l. K  H. c, m% v( A7 J1 I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, }) G0 J( t# U( d3 L" h使用下面代码,对内存使用了mmap函数后:
; Q9 Q7 g0 v( ^' r2 |$ \#include <stdio.h>
- W$ {0 ~$ u0 v- |* _. J2 T#include <unistd.h>
( D7 V: M) ]/ k; k7 w: P* R* r: \( j, M#include <sys/mman.h>$ w" ^: e8 @: B
#include <sys/types.h>% I' N' S+ y% i; [1 a
#include <fcntl.h>
5 n1 e# {5 [( P4 [; ]  ~+ }' ~
( Y- W0 j% H, `3 o4 L: Z# f#define SHAER_RAM_BASE_ADDR    (0x80000000)% m+ L7 j: F) ]. b# N# {) ^
#define SHAER_RAM_SIZE         (0x20000)   
  v$ g8 ?- N# s3 s" `
1 K/ v, J* Q: H1 h2 ztypedef struct
9 j! A0 D2 k$ b6 g" l. I; j% ]{
, I, `0 ^8 a; W8 v7 t; N/ h* Y$ q        unsigned int a;
2 \* ?, U9 }+ ^, q        unsigned int b;5 v0 _3 r: U+ n' k9 ~, A: g
        unsigned int packet_cout;& {( ]" E' E  J' O3 ?+ Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ R9 n. `  i4 v' x

& X7 {0 ^( z& @: [$ F9 m+ P- E' gvoid read_MSG_buffer(int *baseaddr);% X/ F8 Y- s2 P' m& h7 r. X0 g
unsigned int count_copy = 0;; {0 {8 L0 x1 c3 \- i1 A9 X
9 F  j8 P& z. \9 j& V
int main()
: k. P9 ?& ~# Q{  L" L: _: k5 ?( C& I5 h3 p; {
        int fd;' G: i% J. n2 G5 m- a
        int *mem = NULL;
: o) Q8 I0 R/ e5 [& S. m; ]% ]7 w) w, H/ [9 m. e
        if((fd = open("/dev/mem", O_RDWR)) <0)6 m# c; E. _, n* T$ [
        {
  e4 }# Q& a/ ^                perror("open error");
# O6 q2 ?# k4 e! `0 W# d8 a                return -1;
- J9 t5 x, r% F. z2 ]: S( U        }
* V' \' O+ d1 e* A& M        
1 v% C& d9 m3 w; }. U2 O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# N% C- r: b0 g- j2 d. b
, s4 b$ x' d- J9 P3 @
        while(1)
9 C8 S, A4 ^7 |8 S9 k        {# i1 @6 w3 s: n" C, y6 F( E
                read_MSG_buffer(mem);
( H# E7 _0 r! l5 w0 S  ]# u6 S        }               
& S. o- m% d. o* R) @5 `# t9 f/ h}' r* Q# H" \  x

) o+ w6 \: l* [void read_MSG_buffer(int *baseaddr)
" f# u3 q4 ~6 s1 Z{& j2 D5 M" T* a! Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, L$ e" b- e& |* A6 x
9 C; z; t8 T5 z4 D" ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% g/ y: M  W+ }) e  z  O
* ~5 K  g( y$ \  m1 N) w  z0 n
        if(pshreRAM->packet_cout != count_copy)
& j+ S' U9 O9 L) f        {
& \. i) x6 U7 x& ]8 X4 n9 R+ Q: G                printf("a is %d\n", pshreRAM->a);
/ N6 X5 v% l+ s& I! Z0 j& H                printf("b is %d\n", pshreRAM->b);& X( G/ \8 L( L
                printf("count is %d\n", pshreRAM->packet_cout);! L+ |6 ]' Y/ V" t. |1 R, K+ `
                count_copy = pshreRAM->packet_cout;) _( ]. H1 L, R8 r
        }
1 {6 \  k: P. r3 [- p: y! M" D, Z        else
, V" N( ^; ]* O( `. p        {: |3 a( S. z1 M' O+ `* K( |
                printf("No effective message!\n");
# V5 h1 D+ P. Z) M. [- N" V        }
& h5 j2 ^# v! g; f" f, x' m}
; T5 s5 r, m; e# F7 N' A# }  ~  s8 o9 b& w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 O1 W! E: L. |8 W) M! |+ N1 \, n' l
. B$ B; |9 {8 C  Y6 z

. Z: g% ^+ k9 C6 ]8 @1 E% U# B
1 O6 P8 }9 Z5 G; k. ?/ ^  ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 06:06 , Processed in 0.039587 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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