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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 E+ Q9 p2 ^) u  a; Y6 y+ I
- G: R! q. Q; E( K& NOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) ^& L8 Z6 r" L+ H% y8 x#include <unistd.h>
4 M) j! N7 N, _' v! W, I5 n6 n#include <sys/mman.h>
! ~( [* {# m5 @#include <sys/types.h>
, V6 M9 `- d/ |' P" Y) P#include <fcntl.h>
; k  ?$ N3 c6 {) q4 J% c' |7 p: a, f! I% l5 Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & N8 `3 N2 x+ V0 Y

( V  o/ E. _( Xtypedef struct2 m4 M. T0 ~) g
{  z, O4 d/ I( z
        unsigned int a;
3 E+ _  v6 o  W& N% B8 A9 k        unsigned int b;
. G- E+ b4 o7 L+ q. @1 }        unsigned int packet_cout;
* z  M0 m$ A) {& B% q0 G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  a8 S0 G  O  r4 M1 b: t, g$ l# K+ g* ~: u+ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 j  J9 J4 n) k$ a4 _unsigned int count_copy = 0;. r' S! {8 g4 e( y

. Z4 ]( Y) T1 k7 ?  ?# {0 z0 b( \" {  P2 E
int main()4 l# V: [5 i# z  o6 M2 `# u4 J
{
0 f5 F- }* h+ m  |) A# t        pRX_MSG_PROTOCOL pshreRAM = NULL;9 |! V0 E: B" B! U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" M- Y; o& R- Q  Y
2 z  B9 I  ^/ ?. [6 M        while(1)
3 V/ ]' |+ z, B' [: ?        {
$ u. z' p9 n% m' C! C6 s7 v; V! ~                read_MSG_buffer(pshreRAM);; S! [: ~3 a* v2 a$ L
        }                / _: u/ I! Z( z0 k( e0 o; {: ~) _
}
$ ]2 L% b2 E8 b# w5 W1 b! }4 a# s
2 q0 q/ U' I( I5 H1 @7 p  K6 H5 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. {. j2 z  A7 f& ~8 t/ M2 K* d{) S: |& @( z4 _+ ?
        RX_MSG_PROTOCOL buf;0 Y( d7 K; N) j+ m& I
        % f9 g1 u, \5 I
        buf.a = pshreRAM->a;) a7 N) g' ~; Y! J: D2 K" t
        buf.b = pshreRAM->b;
* L- F) @3 U. K0 z. m  Y        buf.packet_cout = pshreRAM->packet_cout;
( V, s2 i# @  ~; H        5 ^* @+ H) |! A) S; E. O# X5 E% {  Y
        if(buf.packet_cout != count_copy)/ r* |1 f8 ^+ h0 o
        {2 L& F* u) L$ }
                printf("a is %d\n", buf.a);% g$ Q* k2 g; ?
                printf("b is %d\n", buf.b);( V0 n8 a: z( {! F) j) X! k
                printf("count is %d\n", buf.packet_cout);" e( c% Q7 r+ e4 U. g
                count_copy = buf.packet_cout;
% i$ i) ?; Z! |6 M2 B+ |        }
) f  Y- u7 y( X1 y3 s; k3 c        else
9 A( B8 _- `  K9 n- W        {
9 U$ y  p( c3 F, x; l. Y7 ]' z9 Z                printf("No effective message!");: |2 B5 {  r' ]5 m; j+ n
        }
8 i- M: _/ N; x1 E( {" p* c}
1 }3 \; q3 \  ~; ], I
& K0 s" ^' z6 G. E. r' j6 u" [- j6 L: S7 t9 l4 e' Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- ~1 l4 R* A! l+ v; j使用下面代码,对内存使用了mmap函数后:. G: H2 P! @2 [9 Y7 w
#include <stdio.h>
$ e; f! I+ z$ z+ X#include <unistd.h>) s# _& ^" ~5 I" h- G, `
#include <sys/mman.h>. k6 m' x1 Z9 N; H- Q6 z
#include <sys/types.h>
  J  e: {3 O8 P2 \! G#include <fcntl.h>! Z7 }- G* G" y1 i! [

4 P9 |9 C& @; J1 m8 l#define SHAER_RAM_BASE_ADDR    (0x80000000)4 e) n5 \+ W  C) i& f
#define SHAER_RAM_SIZE         (0x20000)   
4 ?# d* r* P/ S4 u1 d- A" A7 @% ^1 f, s/ B  i4 }; B0 Y
typedef struct
  z- }* r) Q2 r0 e! }$ z{
5 K, c! a  M, Q        unsigned int a;
% h! b2 D" ~( z$ l        unsigned int b;
7 H3 _- d! Z- F/ Z        unsigned int packet_cout;
) X# ?3 f9 r" J+ z3 c' ^0 k$ x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, A" ?3 a2 e5 r5 [( m. y
9 H8 C' `. o1 z& uvoid read_MSG_buffer(int *baseaddr);
) e. ]  H3 H& _- ]. \5 uunsigned int count_copy = 0;, ^8 O8 |4 f& k

# k2 x6 M4 S% K/ T1 Dint main()
+ n/ z0 v0 z. {& ^5 w5 P{
  J2 ~0 A# V& m1 ?$ }$ _        int fd;- `* w9 x- _1 ]9 H, _# l1 c$ o/ b
        int *mem = NULL;
% [2 P. N; `- o/ ]7 D" \# J# z& Y# d- Y; K
        if((fd = open("/dev/mem", O_RDWR)) <0)3 S" U. B: e8 V9 Q* g( Q% |
        {
3 q5 t0 ^% k0 I# `3 l& S                perror("open error");2 A2 z% C! L( }% h  o. P) C" c
                return -1;
# h9 C/ i; T' {' R        }
% ]0 Y3 Y/ z7 m) B        
7 E! N% L1 b& v' P3 T) m        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" p: A' l) v  Z- q5 {! ~

( ?# n, q9 e' R6 P        while(1)
2 b+ l" ^" ~/ |- O9 O        {. E1 B9 L$ l; {: h; E" V' Z: t& p
                read_MSG_buffer(mem);8 O" Q5 ?( R$ N
        }               
  b& _- `( ~. O  C- z, ]" D/ v}
9 n, u& X$ B1 o9 I$ p4 y" ~6 v' k8 b: |
void read_MSG_buffer(int *baseaddr). D! t1 [# P- C4 f; x* C: P3 p
{
& @  y! g4 y" ]4 T3 p: u" M9 b        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 P/ B# \5 V8 t2 ]
* J( A' g: i. e; \) \9 E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, Q/ x  g) ^, }' Q

! ]& C8 N; {- s$ f        if(pshreRAM->packet_cout != count_copy)
( l9 T) d: `9 R6 O1 ]( N        {' _7 M' k7 {5 M# W  O3 P% Y1 E' R
                printf("a is %d\n", pshreRAM->a);
$ O  V7 g# g% p6 D% q                printf("b is %d\n", pshreRAM->b);
. s# K. T6 r  S0 X" y                printf("count is %d\n", pshreRAM->packet_cout);
0 ?' B5 t/ N4 x3 b- e- I" l                count_copy = pshreRAM->packet_cout;
4 x  `1 m0 j% o" ~        }
& N& {: R& {2 P! u        else
6 n! m( y" [( @& ]$ k' R2 O        {1 m/ Y0 _4 }0 v- n' O% Z) i
                printf("No effective message!\n");
" E- q' w3 E1 M7 u& X3 `+ g4 |8 T        }1 }! o) u3 }. w7 E
}
/ ^% i7 [! ]$ C# r; l
8 k4 \2 q1 i7 e0 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& G% G8 C+ N: F7 Q* [  ~! f! c0 \2 c) @: ~" A. W. T
( F: O8 r, R9 A+ a! w

7 {- D0 m% K% h; U* e2 z0 n
* ?, x1 I1 a% X7 G* D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 02:13 , Processed in 0.040029 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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