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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' M6 i7 D* ?0 W+ f: q/ s0 N. Q( \

: A$ @+ I: S! L! {% }; KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: d* E' h: r/ Y% u6 n) W! y#include <unistd.h>4 {/ z# F6 a- I3 C+ M2 U
#include <sys/mman.h>
' x# k3 k3 B1 p! E#include <sys/types.h>6 q6 i) p" d* h& b& t1 m
#include <fcntl.h>
+ G! i3 ^$ R$ |% g
8 Y3 Z1 l; Q# m% v/ `" J#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 Z( A& C) U! Y0 V& Q4 s6 }; o: v7 X2 i+ u% H4 S( z9 p) G
typedef struct
) d/ M/ x, Z6 e% H2 D3 b{0 w: }9 f5 {$ I5 Z8 U; H" j6 p
        unsigned int a;
* ^) I5 E. c" J        unsigned int b;, r" a6 O& p0 R! _
        unsigned int packet_cout;" j& M# x$ X' H; B1 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) u% q8 s4 H# l  ]: J+ _6 O+ v- x; d8 g1 [3 A9 n% u6 T5 j. R, t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 X( q, x$ E2 J. ?2 }
unsigned int count_copy = 0;4 b) d  l; v9 v- `. `. s
- o7 y% X5 A$ l# K8 h
+ c2 K# d4 P9 a
int main()
1 Y( {! P- V, s) y{% ]1 j1 a5 ]& V# ^7 P* `# y) D
        pRX_MSG_PROTOCOL pshreRAM = NULL;, q" F" M$ K" f/ i# L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 V$ j8 i% a2 B; M. q2 g# Y
0 i$ f7 t7 i9 h" W6 h( |- A- h1 ^3 t        while(1)
4 I$ e7 i5 H6 V        {: ?: S& u$ U% w( I$ U3 n- I6 K
                read_MSG_buffer(pshreRAM);
- T  u  {# x1 `- H8 `" n        }                4 ~' P2 m+ V! G& i* e+ a% ^, P
}
! ?3 d; m6 o8 f5 m6 r  }" j
! ~+ H5 L; j* M! U" w+ C3 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ P5 W* y" H' o{2 y) W+ F# ^% j# h; u0 G
        RX_MSG_PROTOCOL buf;
3 Z! ?" Z( r& ^7 @* ?( W        % y) |1 ?5 J' }" ^! h
        buf.a = pshreRAM->a;$ C4 `* ?% f3 c# Z# S' b
        buf.b = pshreRAM->b;1 J/ C  j8 D: ?: W7 o" B
        buf.packet_cout = pshreRAM->packet_cout;  E5 L$ i' K5 h3 B2 ]
        ; |* U$ u. G/ b& p( }$ i
        if(buf.packet_cout != count_copy)+ G& n" ]# V; i2 h" k3 k
        {
" S  Z3 @4 Q8 Z) a& R                printf("a is %d\n", buf.a);' F9 D  a8 r1 A7 ^
                printf("b is %d\n", buf.b);) _" P0 @8 k6 q
                printf("count is %d\n", buf.packet_cout);8 c7 k+ J/ o+ I7 F% y) S" ~
                count_copy = buf.packet_cout;
* H% T& a) C+ B' Q/ `' F* N        }
! e( a9 u2 ], d2 b1 R% n6 L        else
4 g' S" z8 V' U) m0 C        {$ x" [* p9 A4 v$ J( X  X) p
                printf("No effective message!");/ s* O: F& e* D3 {) H, d# n
        }6 V$ B4 r7 i$ M5 h* S" h' b  o
}
2 G) C5 ]8 [7 j; A' K
  d% N! y- }& P% l7 V5 l4 w2 D# m* Y4 }) p
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, w6 e% n  a- f' C
使用下面代码,对内存使用了mmap函数后:
: n+ ]4 A: N& ~2 ~) o/ Z#include <stdio.h>
, p9 q) b  B, o/ H- M0 O3 |#include <unistd.h>
  Y' r7 U! V% H7 c7 s8 B#include <sys/mman.h>
. j6 T# N2 L- |% |5 I+ W#include <sys/types.h>3 ~" P. Q7 F7 h
#include <fcntl.h>- V# B9 x3 r/ x

5 u1 R( g5 p2 _7 c8 o#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 r( J/ B0 i- e0 m6 n; c" L3 Q3 Q#define SHAER_RAM_SIZE         (0x20000)   / y, L) L* n6 O
' F! D8 [+ E0 v& E
typedef struct% ~) c& q5 b1 x/ t( \
{
' c" d& y# ]2 i. N& k        unsigned int a;
2 b8 B4 v7 G1 |$ _" M        unsigned int b;
- P+ O0 {, k" `. f        unsigned int packet_cout;
$ e" k" h3 c" D; I9 |8 B9 S. V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ L  L. ]5 J& y" T2 P2 O" O' s! v% r
void read_MSG_buffer(int *baseaddr);2 s' Q* |' i; Y# K1 |
unsigned int count_copy = 0;# |/ y2 i' Y0 i# n
8 u7 W0 p- }. W# w0 `3 Z8 A
int main()( I, C2 E1 Z5 i9 ~5 {# {
{
9 v- t! k7 w: @8 ~        int fd;
- D5 x7 B* C+ s" R        int *mem = NULL;
9 h2 ^! S5 ^3 K/ ?8 q, i# t3 s$ n3 p# }/ o5 `% |: l5 J* Y* b$ j
        if((fd = open("/dev/mem", O_RDWR)) <0)& R& p% F, F4 P* b2 D3 \' f% o
        {
4 m7 k' N5 S* T" v# t( Z8 k                perror("open error");* z% ], p& U7 f, h) k; Z
                return -1;, \( E( j. c6 ~- x& R: g3 i- F, X
        }
2 b8 |1 E( g8 \" E4 x        3 r9 ]( r: k0 [. w
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. ?/ v" U7 ]: {. \
" C2 v& g6 v  b+ d        while(1)
' z( j7 g+ |* L$ c$ ?5 A        {5 S0 f: y7 P7 D: X* p! j* C
                read_MSG_buffer(mem);
- |! |! A- y  O" A8 C! C        }               
" U: r+ X2 A6 {- \% _, v+ q}0 D" R, p: g6 v( t4 z

' R  z# P4 F6 K+ }0 g' A; n) rvoid read_MSG_buffer(int *baseaddr)
4 p/ n+ ~! I. k; S{
( y4 x7 o2 b) {) |2 f        pRX_MSG_PROTOCOL pshreRAM = NULL;# b4 r7 B9 B) ?* U& f$ G

- ?- [, U  G0 M, ]; U! k2 Q% A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: a) m, L. i( a: a, L9 m
+ s3 K- }6 b( |9 b
        if(pshreRAM->packet_cout != count_copy)6 A, z4 L5 u+ Q0 U7 J
        {7 J# D4 Z5 z1 ?, M; T/ N6 [, L* T
                printf("a is %d\n", pshreRAM->a);  }8 q/ b! F3 N1 x$ _8 ?
                printf("b is %d\n", pshreRAM->b);
5 ~5 x, \" U: w2 x. _9 `$ M" q! D                printf("count is %d\n", pshreRAM->packet_cout);
( I4 Q& F# S# z1 J$ ^% }                count_copy = pshreRAM->packet_cout;
$ G- ]! ~0 Q; H  n+ T        }
6 h4 X# w- o' U. _0 a        else
3 x: x1 u8 c0 h4 t        {
$ p- E" t8 v7 }! s                printf("No effective message!\n");
" O/ t* _7 u4 C# g- ~        }+ D5 n) \* V/ B* m
}9 z7 \! t! T  n, Q) v# |" i( _5 V- |

8 x" f! }" B; @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' ^* ^8 K3 \2 n
6 ~/ J5 x& Y7 _& a* B
% q5 A' Z7 H- O: Z; s: {) ]6 {
' Q; q4 Y# r! ~
9 H1 r& y+ w& ]3 b! i7 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-15 06:43 , Processed in 0.040394 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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