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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 p( N( C" R, z$ ~( k

# }# A+ K5 m" V1 P7 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' S2 @# o& h- p. L8 z% V, |#include <unistd.h>
$ N/ f4 G; o& a: E. s6 Z#include <sys/mman.h>
# f  V3 G8 x. l) X: P7 x- g#include <sys/types.h>
+ H) O; P* n4 n) d- Y#include <fcntl.h>) e$ t% E/ }# F( n# _

) b. ~! z# k0 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   & J- z3 S8 Z. M( ]: ?/ I9 a
, q0 J' d' r; T
typedef struct
7 c. Z2 {0 M- u# Y{& ~; X. _+ U( n0 N8 u. _
        unsigned int a;
9 `) b' Y9 q! [# \" x        unsigned int b;
. a& l4 e3 D6 @7 s" z1 h) M        unsigned int packet_cout;
8 ]5 R7 o; M0 ?6 [+ N$ P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ V% ^8 F$ t4 O" j) L& q/ j  B: H8 y7 b4 V, E* O( y$ Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& O$ e7 y$ V$ i( M
unsigned int count_copy = 0;3 w5 l% [( ^1 `: t

# O" h- U3 H; {( Q+ \* O" W4 {) x4 |& H1 B% w3 i/ y1 ]
int main()
: D* @7 b. P  r7 v7 r5 S{
9 s# q. S9 E) Y: W        pRX_MSG_PROTOCOL pshreRAM = NULL;  y: u) H: T0 P! ]& f4 v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, {3 {$ n; K" V+ R- @) q1 l3 g6 w: n5 D# S* H6 a( J: u
        while(1)9 e: e0 ~- `% {8 u# d
        {
3 y1 T7 D* e) o( j! c                read_MSG_buffer(pshreRAM);
, k2 L9 A6 F+ r8 X        }               
0 b  S2 x# c$ s* h. I}% v0 P% R7 Q! B9 X- J5 g( H
, n7 h" Z- ^% u# l' a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ r  p* I0 b- ]3 A2 E
{+ D8 ?- `5 p/ u( H; p6 }1 O
        RX_MSG_PROTOCOL buf;' E% f/ o8 t. {8 w6 C, i
        . R7 c7 s* S, f" w* s
        buf.a = pshreRAM->a;  B; z5 g4 @3 x, R
        buf.b = pshreRAM->b;
2 \; a+ i9 }. Q) m        buf.packet_cout = pshreRAM->packet_cout;3 E; @" w5 }9 ~5 y4 E4 k
        
8 W- E- U1 ~+ }        if(buf.packet_cout != count_copy)+ N( Z; N* a2 c2 ~
        {
" }3 R0 t2 Q4 o2 w                printf("a is %d\n", buf.a);
, Y! e: H$ y/ {/ l( i0 W' L                printf("b is %d\n", buf.b);
) e/ {" j3 X% o. A* Q                printf("count is %d\n", buf.packet_cout);* o3 s( d7 G% C' q3 T# z
                count_copy = buf.packet_cout;
) j' A# g. s" N( h        }8 Y. ^4 g" M. n
        else
; s9 [6 R, Z- B% Z        {
1 V! B$ Y2 z# X5 `- b; [+ ^1 x: J                printf("No effective message!");  u" m( t8 w2 {# q5 Z( j* c
        }
/ F/ b& l) @1 i( {* y}
' N; s: N: v, a+ m5 s8 V8 h
' ]2 [+ _+ j. M/ t: w7 ^- B2 l( R: i1 I4 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& B9 A- Z4 s& t% }
使用下面代码,对内存使用了mmap函数后:
2 o# O+ M( _4 A4 V: j#include <stdio.h>( x- Z2 i7 U6 c0 O: {/ e8 _
#include <unistd.h>+ t" f, g/ M% H  z1 V
#include <sys/mman.h>
4 N& }9 h5 v* t- F& x3 q* ]! ?#include <sys/types.h>7 P" v' z: o' |- ~2 _+ N
#include <fcntl.h>2 A  A* Z+ y3 N1 x5 J

2 y$ a9 s  Z" S4 m6 K( L1 p: R#define SHAER_RAM_BASE_ADDR    (0x80000000)0 F! x/ t+ s/ s* i8 Q8 C6 S
#define SHAER_RAM_SIZE         (0x20000)   
1 L) n* g, D# d+ d5 v; }1 b; L0 I, D/ u; m; m* s; n3 K
typedef struct' p& P# D7 Q( N0 ]( C. i
{! z9 ]% \7 G8 Q( E. L
        unsigned int a;
9 [: }! \" f& z        unsigned int b;
+ j! z! {+ ?$ `, O5 s        unsigned int packet_cout;
4 N, s  C) t% ~9 H7 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! `2 T$ J6 Y/ t3 m9 E
$ ^( B3 D6 P: s( A+ Dvoid read_MSG_buffer(int *baseaddr);
/ C- C) o. R2 ~0 Lunsigned int count_copy = 0;
# M+ v/ P' @$ w% c! y) @- L8 I2 E# |3 W1 e* C, M! k
int main()
7 n1 J* U7 Y  ?: ~( o% {! |  u{
5 J3 d/ X; _; M2 R        int fd;
9 Z. w' E" r# |+ T& H        int *mem = NULL;
2 V6 K* r/ N9 m& H; l% h7 i( n
) F( A7 `% P, V6 u3 _. k. f5 ^        if((fd = open("/dev/mem", O_RDWR)) <0)8 a5 M) Y; S, y; ^/ c: H' }
        {
# e' D6 t) n# l                perror("open error");
8 B/ C3 Q1 J# X9 D5 `; q( C                return -1;
% p/ M! a# s9 f        }
4 Z$ n. ]0 f  {- M5 |        
/ i, c/ A% m0 t: L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& e% h) A6 Z0 ~8 I$ ^1 ~

& E4 g7 j& }: P( Z7 y( F        while(1)  F' j* J; G# W4 a# b9 q' {% f
        {
8 z- z9 G7 N2 x" K                read_MSG_buffer(mem);
+ t0 P4 _% p  d% a" a. Y; v        }               
" ?# i5 b6 w% |0 l9 g}) p+ ]# a$ x- u$ k& w

/ {! u1 X# {$ q' f  @' \* jvoid read_MSG_buffer(int *baseaddr)
# V! |& b& i8 Y; B, `{7 m0 T6 i" q4 @+ O! L: u
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 d4 k  ~) U5 s: i! U, p5 X
& Z5 j0 o0 Z" W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 I: P7 ?0 f. w) I3 i7 l1 V  F
2 Z3 R. s; X7 F2 ?; Y8 C        if(pshreRAM->packet_cout != count_copy)8 E: _. J6 |8 Y6 n' I9 v2 H2 |0 U
        {
8 I# ^; F7 |2 H& c  \( X/ h                printf("a is %d\n", pshreRAM->a);# q" g  S9 j+ F& Y7 ?
                printf("b is %d\n", pshreRAM->b);
5 K) z9 P' ~1 Y                printf("count is %d\n", pshreRAM->packet_cout);) d+ h' ^/ X3 }: l, V* c, g9 e
                count_copy = pshreRAM->packet_cout;0 S( c! H2 K; ^# h& F
        }5 L1 s, s, _) y: W' Y- w
        else2 p+ c% g9 Y; Q/ P4 H
        {" v4 R1 v- g0 F9 J
                printf("No effective message!\n");& m, O- k  N* t5 ?
        }
: {2 |0 S3 W* \0 w1 A' b2 ^) K}# X% p1 b3 L% }3 b6 r+ J

% m- w5 a" M- J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" p* S# H3 Q0 _; I" z" q* L
% l1 s' k$ Y  E
2 W9 w3 B* d( k9 Z4 Q7 u- d* S

2 w+ ~2 o* c' G! p+ f, b; V
! F/ {; O8 a2 ^% M+ K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-17 22:13 , Processed in 0.042052 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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