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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 t8 v7 W7 }% H- }" M9 R

! e, q6 u" }, \4 a* lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) M7 m: D5 G: s6 i7 b, x
#include <unistd.h>
& ]" {8 s/ m9 e+ S5 E- g#include <sys/mman.h>; U% a7 x# ?! A: h* [$ F
#include <sys/types.h>: ?$ {6 Z5 D0 w8 r% R& j# Y# }
#include <fcntl.h>
5 _2 b) w& c# Z2 [; r' B. x7 U; H0 w7 e$ s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 V0 S! @: o8 ?# u- z& K# T3 S& y! m- [& h
typedef struct2 B% T, s; u& n! f- L
{
  p4 {4 v! ?* {$ {, t        unsigned int a;8 z- @; h& f( v8 j
        unsigned int b;: U% Q) G) D; s" t% B$ g
        unsigned int packet_cout;% b, x. U5 l" t3 ?3 B: a+ i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* C  r7 i' ]/ n# N. P" T  Q
/ G) y  R* r" V$ A. p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 M9 w# c0 A( p4 u  g$ {* u& Eunsigned int count_copy = 0;- h: s+ ?5 _) y4 n6 Y! I2 l

2 L, D' q( x- y7 K+ P
! @4 s2 o$ Q0 Eint main()  i- T) F& y( T5 D3 F3 V: W/ M! R
{
) p( \" q  k; Y4 w        pRX_MSG_PROTOCOL pshreRAM = NULL;
) `- d1 R2 \1 E3 t9 E7 C  I1 n2 X8 E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  i1 F/ g; O) I% E
+ m& y0 j, y- ~0 @* D! G) i6 O0 ^        while(1)3 C1 J1 A# J% m  q
        {
6 ^0 Q1 z; l& M  w9 g8 K2 A" N8 P* B$ ^                read_MSG_buffer(pshreRAM);
" m3 P* _' m  E: g- z        }               
  X, t5 A% _' k/ O2 q}8 ?" k3 j0 B1 J8 W
" c6 z7 D1 m+ U! J. a* ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- f; d4 C- ?* X+ G: e+ n{
& g3 _! \, D2 a, c. C( r3 P        RX_MSG_PROTOCOL buf;
: I- i9 L7 ]$ V        
( I1 N$ E% \- M. A        buf.a = pshreRAM->a;
7 G1 Y$ d9 |- n# n9 D  J        buf.b = pshreRAM->b;
5 V$ `, B/ P. G  H! f: }; O$ B: u        buf.packet_cout = pshreRAM->packet_cout;
- ^% d+ D3 C1 Y/ L! l! u! j        
, A/ \, h) z$ W/ I' N5 ~        if(buf.packet_cout != count_copy)
1 P9 w8 K" U, n: k/ `0 T        {  S* y8 b  I- h4 \$ `" w  p, W
                printf("a is %d\n", buf.a);! c) ?7 r) v" y2 A% r; v
                printf("b is %d\n", buf.b);
) T% k+ x3 e6 C5 T                printf("count is %d\n", buf.packet_cout);
+ I! i/ m0 x$ s                count_copy = buf.packet_cout;
- u& b2 g$ ~1 D/ \$ g! \        }
) `" z! F+ `8 O# w        else
; x2 ~  T" a& p& X        {
: T  Y% f3 W/ F% W  W. Q- W                printf("No effective message!");$ x2 j) k; `& a2 @
        }
2 E; E- K8 N- W( {: b0 G4 K}7 m4 |/ p$ i7 F: N+ c

' q3 i8 R! U' Z  M
8 L( ]/ E$ ]: y5 c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 D1 W3 W/ |) T/ J5 [# n3 v) ^: w使用下面代码,对内存使用了mmap函数后:. Q+ Y( Q3 K% y9 j- ?) z$ _4 K
#include <stdio.h>
! Z# @9 X9 M7 Y$ W7 U% L% ^5 }#include <unistd.h>
! d  w- |4 T6 E0 D6 `3 s#include <sys/mman.h>/ W* A0 v/ F) ^* S4 {( r* d
#include <sys/types.h>3 q$ f7 U$ o0 y6 s  t
#include <fcntl.h>+ U3 J' G9 A2 K
) @5 F: k  r( |  @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 t! a3 \; J, G! R/ E#define SHAER_RAM_SIZE         (0x20000)   
& f: |$ y& z2 r' k& D& u
/ P" H+ u: e% ]( H- U/ Q( {3 _& X) Gtypedef struct0 g4 m' ~( N8 `6 \$ m. B% C
{# }( U' T; p2 a' z
        unsigned int a;$ G8 a; }9 [4 w. T
        unsigned int b;
" r0 k0 N, l* T        unsigned int packet_cout;
  [6 x5 [& I7 r! H  a" w& o4 M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 h0 K3 m  l" F& c
( ~" b, `: w) e, }: H9 [5 R
void read_MSG_buffer(int *baseaddr);
+ U4 }  k$ ^# G! S4 e$ T" T; [unsigned int count_copy = 0;
0 Z* i5 _6 w# R+ m6 l& r& B
8 y6 V- d# T0 u# T/ ~int main()
+ w, G+ v2 W$ [, E4 u/ F7 X% n! x{: S5 f3 v, z8 h5 T3 p) t
        int fd;
: V+ m; }0 o8 ?/ P( L) X" W        int *mem = NULL;4 R" r# m) P! a; G0 O- `; n
4 [: _; `! |3 t1 ]
        if((fd = open("/dev/mem", O_RDWR)) <0)* q3 l' U, W* W4 f( ~# u
        {# A  K9 M2 U# v( O/ X
                perror("open error");9 ^5 ~$ F* r" c- d3 M& Z" [6 V
                return -1;, B/ {5 s1 P# [! \( P9 b* T8 {
        }
+ H  Y' T# |- {  z) L2 `        : O( s; _) t; ]# {
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: C6 G: B3 h! _: l  u* J$ N- W
0 R) f0 A# T0 L. I# ?, ]
        while(1)
% h: [9 [' {' ^) L2 z        {
7 [4 w! i8 @0 ], @+ f0 z. O                read_MSG_buffer(mem);" E1 j& I9 h/ u  x: D1 }9 c) D
        }                # {0 j1 @5 ~. K! q) m4 f( \) M) I; z; L
}
. q. {  n# ^7 S- g6 F4 d0 c0 Q% Z, M6 u0 ~7 P4 K, A
void read_MSG_buffer(int *baseaddr)
; G' W4 s1 P1 _{
8 j8 c+ B8 d2 R% ^* U; t$ d        pRX_MSG_PROTOCOL pshreRAM = NULL;1 |2 n. N- R0 \! F
6 E0 P& R8 T8 T9 V: _- O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( {0 D: E+ s: B: |5 P" X+ s/ l* ?. c7 F6 x
        if(pshreRAM->packet_cout != count_copy)# J; j' U# k! z' _
        {
+ i/ o* _6 A1 C( k' b                printf("a is %d\n", pshreRAM->a);
9 e0 d! d- _8 E" R; \- j3 }                printf("b is %d\n", pshreRAM->b);
) P: w1 T. o, b$ f( C$ I                printf("count is %d\n", pshreRAM->packet_cout);
' s4 L0 |# P2 H! {1 O3 g+ N% J                count_copy = pshreRAM->packet_cout;
& z5 x0 r0 f* y' }9 Q+ n" `" I        }$ p0 H! l9 n7 m5 z/ |
        else
6 e4 x3 G% W; b- }/ E4 _$ E' I# X        {) r; a5 ~- T. N- W# D
                printf("No effective message!\n");
2 u9 C  S% i  ^+ k        }# }& D8 q; j( N7 Z% V' ?
}: B" n/ \& N" J# o
7 R" _: `! W! y, \/ [' f* L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! h. ^" ]. ~5 ?, B& c8 c+ Y5 `$ ~8 R9 x# ]

6 c% V2 U' W7 W0 k; ^1 G" F& u$ J9 a( i
, Q. C; G+ p1 k: R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-8 03:53 , Processed in 0.049346 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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