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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  L1 x( q) v- g7 S9 R; o) ]0 p: H+ x! t9 r5 _. v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ~" i: p; P6 c* X+ V8 p& T#include <unistd.h>
! a5 o! U% [4 G1 N" y#include <sys/mman.h>
$ {6 b" R: s6 b# f2 h! n& \$ q#include <sys/types.h>
# g, Y# u. n7 Z. `6 l' M#include <fcntl.h>( N& s' S' g% ~( h- x

' S9 ]/ l- u  w/ _( }. Z# z9 @#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- C! V4 W3 a2 N- @( E0 ~; c" R$ N
typedef struct
. w2 \; p; ^& z1 }2 w& o{
* w7 l6 a/ r4 k        unsigned int a;
+ d  Y) P0 A2 E5 [! G; a        unsigned int b;4 Z& t8 f% _) J9 o+ A+ w! W
        unsigned int packet_cout;
( R- k! V5 _# {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( H( b( P- F( U, z$ I

5 Y6 T$ m9 E% D: P9 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 \8 s" H* x/ s, R. `
unsigned int count_copy = 0;
( W  ]" }( ?4 m, i
$ k. P) t+ c4 b! n- y
5 v  N8 |) U5 g# Wint main()- @$ O4 ^1 b% ]6 S" M/ F
{
, }! K+ Z5 H+ w7 v$ [, F  Y        pRX_MSG_PROTOCOL pshreRAM = NULL;. W) v& b/ `  K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  B9 X# S/ Y" x- @0 t
  ]9 N7 j; J4 N- E  m        while(1)
8 u3 U2 V+ M5 m        {  S5 y, V" r. U2 l# p6 y$ [% b# C! M$ K0 z
                read_MSG_buffer(pshreRAM);! r2 F/ U" i7 q+ ?4 e' N
        }               
! Y& {5 ]. o, T% P5 K}
; `" }6 }; ~* h
: W9 `! Z' F, N" |, _+ J+ |% Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 o. x( \# V  x5 d* Q
{
7 }7 {% z( ?2 H0 _# }        RX_MSG_PROTOCOL buf;
6 K2 m) C6 T9 w1 z- W$ x# \% P        
5 e8 v: O/ k7 }9 U        buf.a = pshreRAM->a;; l8 U$ C  A* ?  Q" e0 `; s
        buf.b = pshreRAM->b;
  Z" P7 n: i- v+ o5 A8 e0 v        buf.packet_cout = pshreRAM->packet_cout;
4 d9 [) l' T/ t        ! l9 m. k# G- X9 P) P
        if(buf.packet_cout != count_copy)( I6 h; o8 _( K
        {
- ~' j8 ]7 y$ Q# G, @8 e                printf("a is %d\n", buf.a);
7 o, l5 z3 c$ i, e" `" q                printf("b is %d\n", buf.b);
7 |; j8 j. F" L# w* O. P                printf("count is %d\n", buf.packet_cout);
0 X/ P( X8 f, [                count_copy = buf.packet_cout;, ], M! Y& a9 p0 F+ }
        }6 M6 K. I) m) [
        else( _6 W+ W$ B' x
        {& Z2 @9 P2 k2 L- `; H
                printf("No effective message!");4 x$ e9 x: S! C% |# V! P9 ?; O
        }) i- `* F. E, v' F, w+ {+ {# r$ ^
}
  p. U! J$ H/ M$ {3 C
# F/ f* Q4 X/ T0 [9 @% ^3 x! y
# j/ U, }. r" I; S7 v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  @/ k- f% }8 \9 b+ j" h8 ?使用下面代码,对内存使用了mmap函数后:; T  y! ]& p, F% E: R' l
#include <stdio.h>3 d2 _  x/ V! P8 t. g& V* S
#include <unistd.h>
# S2 A4 i& v! e#include <sys/mman.h>
- q5 t. g1 t' L! _#include <sys/types.h>! [9 H. p, [. K$ d+ I
#include <fcntl.h>
2 ^9 R- p. X. R8 q1 u+ {' h( R  r- \
#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ b) Z* ]1 h& c) l9 l#define SHAER_RAM_SIZE         (0x20000)   
7 o2 x7 ^. W5 b2 t8 S$ x$ `
0 B5 m; O5 G  Q/ x$ _typedef struct
* |* x  l2 c$ {( V{
/ y7 x" w0 |6 g7 E0 r2 x. D# a6 e        unsigned int a;( D, [  |! q, }7 `" t+ y, F4 Q+ r9 ?
        unsigned int b;
2 C# |% A% `- k        unsigned int packet_cout;
: y& A) F1 V+ O+ b6 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# b, J- |7 G# \# O% P9 d! u

1 Y9 ~5 b# ?. f/ o, pvoid read_MSG_buffer(int *baseaddr);
; R* z+ T& [" o; |4 d9 l0 zunsigned int count_copy = 0;
3 j$ j8 K' E# k2 L+ O% P/ Y
1 G# ^( d& j8 q7 T8 wint main()% L5 S0 s0 G" y/ ]/ g( O
{
% i$ J3 B: V! [1 Y8 d. s. P        int fd;* T. f  S# s. f4 F
        int *mem = NULL;
4 Z* X; w3 N+ J9 Q0 ]) \5 Q4 T& ~3 ^4 F8 p4 K4 e
        if((fd = open("/dev/mem", O_RDWR)) <0)
5 J- P( a2 i& ^5 F. I  T0 D        {
7 e$ V2 a5 a( G& e1 T                perror("open error");
' N9 I6 e$ W" |; Z! ~! O  D                return -1;: U! [& N0 ]; X: |! c
        }
7 E4 Z0 {& [7 e1 [) D+ x        
' j: T/ e3 U5 G& N: K# U% J- s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- w* C* k5 D2 e5 E) A7 s: Q9 r3 y  N0 D1 M
        while(1)
8 y3 @9 ^6 U5 F1 P, M! g        {
3 M# g, L0 h; z# j* x                read_MSG_buffer(mem);$ B2 V) a" i/ O( {+ c
        }                & u3 s( F8 a8 U% H) D1 G' I: T+ I: j
}- R+ n2 _# t, ^* \/ L
. x+ J0 o; _0 N( l# C! ]1 ~
void read_MSG_buffer(int *baseaddr)# I& S/ ^# u# H: G& J; S6 k! X
{9 m3 T5 z7 Y3 n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# }  d" d1 u( D6 I; g5 t% y6 k& r& K, {/ d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( i0 e, z! k4 T; v; a6 n% t6 A( e, Z% G& L, {
        if(pshreRAM->packet_cout != count_copy)( I' a% `4 Y4 k4 ^) E3 p
        {
* H) p+ \5 ]# I! b                printf("a is %d\n", pshreRAM->a);" B+ r+ q# h  y' N
                printf("b is %d\n", pshreRAM->b);% n0 E# o+ a  e! [, M8 k3 D4 b
                printf("count is %d\n", pshreRAM->packet_cout);
2 w& [1 U: C; W6 r                count_copy = pshreRAM->packet_cout;
4 }) J: s: X0 e  {- \  v        }9 O( G. W. }0 _. K1 T. _- Q! f
        else
( r; Y5 x8 M& ~2 J. d: I        {8 S8 k0 H( }* Y( f1 W
                printf("No effective message!\n");
; E: Z: u0 k. t: u+ ^2 @' R        }2 e% s  X% q; m# a* P0 a$ @2 c3 Q
}7 I  q' O* n& K

) h! k9 K& s' f( z& E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! h: C6 Y0 i+ q* v

3 }2 y0 g  `+ B2 c4 y
" b4 A! _; [! ^( C6 d2 N% v" }
: R, j9 B* ~# s, K$ P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 22:00 , Processed in 0.047322 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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