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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 Y& }3 s# g! P1 ?' b2 e* _! \; Y# L7 D+ d3 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% b8 Z0 F% h7 j4 e# ]$ N
#include <unistd.h>7 N  W2 ?. U, [' @  C* g% z
#include <sys/mman.h>
4 p) m# j; h8 b#include <sys/types.h>, T2 \- r6 ~  x' }8 O- f
#include <fcntl.h>
+ B2 s1 h$ n2 N/ G) K# H3 e6 O* t( w- t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 s. x, @( @6 k5 W+ M# ~, i$ |$ u

* ]+ H4 L$ |  htypedef struct6 a  m# }. C1 |6 \$ ?! }' e
{
: N7 K# w% H; t& F& H- ~' ?: U( @        unsigned int a;3 {/ }+ q' q# j3 d( C
        unsigned int b;' R, }& b) y" D3 O
        unsigned int packet_cout;
9 M  p3 X& V4 \. ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! T8 t0 g7 U! `. N9 i# q
! J+ U/ G: Z# z6 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 J# f+ Q9 V. s& c1 x: bunsigned int count_copy = 0;# R) Z& o6 [1 E. v( \

3 N4 y7 t- W( i
0 R! r4 V! i1 u( u' Oint main()
& i7 m! s* p% z0 q2 s, H{
6 N4 u) Y$ H; b  Y; Q# x& V        pRX_MSG_PROTOCOL pshreRAM = NULL;# b5 {* K5 C+ D2 N- z7 o/ w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; ~. N9 y' f/ D0 X

) f" k* r% q% w5 y5 A9 S- g, f1 w! Z2 v        while(1)
) w4 G- G) l% n$ m        {# D& U, c2 p/ l) S6 t: m
                read_MSG_buffer(pshreRAM);$ a/ k+ m* L5 U$ i" e
        }               
1 K3 d* ~% }2 l" j  \; w& l}
7 v, u0 E  n' ?0 ?) D
' C, h* c+ }! R  ?$ x) y5 s% p, hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 ^: [6 n0 r+ c4 n; T8 S, A
{  U9 e) B% }  O+ o, e% Z% _" }
        RX_MSG_PROTOCOL buf;
& p3 v; @  g/ o/ j4 ~2 Q) k" }" v( p( H/ m        
: w8 I8 o6 t+ o# o6 D% ~4 l) d        buf.a = pshreRAM->a;: A- b) a+ `5 M9 `2 d; j
        buf.b = pshreRAM->b;
$ U( A$ Z3 C$ `- Y        buf.packet_cout = pshreRAM->packet_cout;5 o6 P2 u( h* r) I" e3 G, h
        
' V  o1 Q8 G# j/ A& n        if(buf.packet_cout != count_copy)
4 S: p  e$ Z+ h  ]        {
2 G+ _, K. a* i8 E; q4 |                printf("a is %d\n", buf.a);# ^0 H9 N6 m+ @3 X, F$ A
                printf("b is %d\n", buf.b);
8 R7 _' f+ B7 B) l5 g' T                printf("count is %d\n", buf.packet_cout);) Q% q8 I' s9 S' ?' [
                count_copy = buf.packet_cout;; [1 h6 p# B" U1 K7 n: I
        }5 F  @' H3 k9 O- r" r
        else9 U/ I/ q! }2 g! A& E( A
        {
; Z; k& K& P  c6 p; ~                printf("No effective message!");0 E# I! o' a7 l  j  t9 @
        }. z4 B. D+ ^7 K
}
* C8 l; {1 o6 x! i! d5 g
, ]8 ?4 S" D# i' L. y! n/ c! d& g* ]" S) C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. [5 {$ m' c4 h0 ]) h" }; }
使用下面代码,对内存使用了mmap函数后:0 S0 N- l7 h8 y7 p- T, w
#include <stdio.h>" J2 b" F% K. _- `% q) ]! N
#include <unistd.h>
% @7 h/ d3 \- T; U% h" L#include <sys/mman.h>
7 i* M6 Q3 V" n. w0 `. Q5 e) h8 {0 v#include <sys/types.h>9 _( g$ e& R, s2 f$ v
#include <fcntl.h># a' a5 O' w8 P/ G6 u
/ E: }/ j! L' B% y% O
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 l$ X* h; `, J
#define SHAER_RAM_SIZE         (0x20000)   
( R" u; M9 n/ P5 m
! _6 ]; J) l! ]typedef struct. |7 |0 q* ~2 _8 v& r* M
{
# p6 s; c- ], d( `! u5 c( x# p) k! o        unsigned int a;/ p2 R+ c! K! s. M1 R
        unsigned int b;
) z5 a% i8 z- n  W" m        unsigned int packet_cout;# P$ v8 }5 F" @+ S  _) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 U5 V& V6 x- Q% ?$ w: Q2 w! q+ `( D' x6 I8 w0 g
void read_MSG_buffer(int *baseaddr);
+ `8 W# i! [& W4 eunsigned int count_copy = 0;
7 ~4 @* C2 P6 N5 l' c
. f4 l0 Y) d1 ]6 Sint main()
" [- x  O! o/ m: a& b" ^' O{7 }0 z2 {& Z) D% J/ B7 Y$ [  v
        int fd;! J, j- T* m4 e4 M" a6 f  W
        int *mem = NULL;
( N7 H' F0 p  |) v5 }& H+ m; r
+ e" Z2 J" S/ x: l  B+ k        if((fd = open("/dev/mem", O_RDWR)) <0)
4 c6 f7 A" R% H1 l- d) S5 e- F        {! W& L1 a# [" [& \* V
                perror("open error");
) M: Y9 ]0 k. I                return -1;
$ t2 y* }, r1 v* e% h* X. b% Y        }! G" \, Q2 I9 a
        & z3 U/ B# u$ [; J$ p) ^$ X
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 X/ b( B# [2 I' _: j) G; u
1 A# v8 u: N! k2 M. I* J        while(1)+ j6 u% p7 Y) b& }
        {
% E/ P! K7 T6 W- O2 @                read_MSG_buffer(mem);9 y: z+ E+ T, z
        }               
: s1 B; e0 r, w& j( y: \3 b" K5 w" ^}' P; M% w2 e4 |+ w+ W; n! n+ n
0 v1 z+ E+ m) E( |, g! t' {
void read_MSG_buffer(int *baseaddr)
4 b& E' X0 K8 g. R* z) u{3 f) U9 s+ Q0 o. z( F! l
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 W  D* s# T! D3 |: W" s! f
! A7 [' S) j" S3 u$ s" W$ l- o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 z3 k6 T8 R) @5 C" Z3 r9 f
, y' ~: r9 `% ?  s: Z& m3 o/ P
        if(pshreRAM->packet_cout != count_copy)
  V7 {' u( n! H4 H: ^5 i        {! N" s/ W; |9 L2 r! k6 q3 B5 E( b
                printf("a is %d\n", pshreRAM->a);
; v4 K6 g: u1 w/ h$ x# l                printf("b is %d\n", pshreRAM->b);" t$ G! z, ?) x4 k6 Z2 S* j
                printf("count is %d\n", pshreRAM->packet_cout);
1 b. b3 `  P% E' X7 }' L                count_copy = pshreRAM->packet_cout;
& X1 n$ l7 v1 ~0 H% F        }7 J0 y- j/ h+ W+ S7 F( _2 v. B
        else1 p( A- S, S3 R
        {& D  m! z- o: n2 J3 Q% H8 D- d
                printf("No effective message!\n");: t  X: |% {# w# d. G
        }' P: d0 A9 _* s9 L5 s
}
1 ?- K; j* F( a4 U% v) |: S% c$ n! U$ h; I, _0 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' c8 m& ^# Z5 N7 h
7 Y; y& h9 i% l2 H

! i& Z) l( x2 X" G) J1 n* g5 l
. `! P% t' X. K/ c4 a+ l6 V) c  x8 v* B6 A3 @: _" g9 S& V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 14:59 , Processed in 0.041232 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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