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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) T, L, U4 u6 @& s/ ?- R: {9 M
, C! n; ^3 q0 o" x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 r# p1 H' M4 F0 @# C3 O#include <unistd.h>% |# l) {% E8 C3 ~* I% J
#include <sys/mman.h>
- S+ L9 B! H/ U) U; f5 a$ S#include <sys/types.h>
1 T$ k# w; o& f8 g& g#include <fcntl.h>2 K0 o8 ]1 E0 T( U6 b
- c; `7 k, F7 A( R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" _2 q. B/ S$ ]0 n! Y1 O% v# K: T, ^+ ^! K; U& ^+ S
typedef struct2 V& d$ d, @+ K! v' l
{' ?9 f; T& Y: W
        unsigned int a;
2 O9 e; {. }! e! `) Z" J3 H        unsigned int b;* p9 P5 n. w5 A6 R; w: v
        unsigned int packet_cout;+ V" ?: l" t' ?, y' r0 ?6 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 i1 `! S- S. Z3 {0 m' @
0 b" |& |' {; fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, V4 y7 _0 Y. o, s! [
unsigned int count_copy = 0;
6 D6 V. p) G) d# w/ m
7 I. c( o) P# a) |- R5 S* F+ k. o+ A7 z* k
int main()
! Q, p) C( p8 ]) n{1 N# {0 \, I6 r! R- T3 @0 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;% E3 R, d* I8 y1 E" e3 u( W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* q* N* n5 F: ^* s. U, z
' W$ q5 K  I2 Q' _0 z
        while(1)
: g: S8 B% K( d        {% S* {, q* L7 c( K, \& n4 x
                read_MSG_buffer(pshreRAM);- @+ v5 o5 o1 ~: h; `
        }               
% F" h. c% ?& i* T/ i}/ T  }. I; A0 ^& U1 _. g  u

9 _% z& |: H8 m% avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 a2 M: ?/ H$ x" j8 Z{5 o( A1 O5 c6 _6 b8 s9 P
        RX_MSG_PROTOCOL buf;3 i9 ^" `$ w  }+ Q/ x5 c
        
' i- ?) }$ q. F! k( L        buf.a = pshreRAM->a;
6 e( A- w: d/ B/ E9 m( v5 s        buf.b = pshreRAM->b;
" i' ?, j) c' `/ x        buf.packet_cout = pshreRAM->packet_cout;
! p) ?. S+ L9 ^& p( r! k; J% [        
) z7 Q/ s: u: x# r0 f% H        if(buf.packet_cout != count_copy)3 g% u$ `5 I0 @6 E- J; @" `+ X
        {
' z% x4 @/ K( }, ?5 T  s  m                printf("a is %d\n", buf.a);8 K( }, I- [& j" ^
                printf("b is %d\n", buf.b);# S9 f& k) x* k
                printf("count is %d\n", buf.packet_cout);
* W+ \- e: l/ Z4 P% E7 Q1 n9 c% }                count_copy = buf.packet_cout;
, J* a* d7 C$ Z$ Y: I8 ]        }$ q5 y8 p4 g" P4 h, D- L( I& E
        else
, b8 m* i( b7 c/ G. ]5 _# O        {
8 p  M  b8 A& R  d" s/ a' X7 B                printf("No effective message!");3 k  R) I8 y7 z# U8 m
        }5 P$ U, p% Y8 N! y2 n
}
: _0 s' F, [6 r" w8 [" N  H5 S$ {; ]' z1 ]
7 A7 i& B: z+ p2 C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. V6 U2 }; y  C/ e- z: j+ E! U使用下面代码,对内存使用了mmap函数后:
' w# u- f2 y* a#include <stdio.h>
1 c1 Y& p' F! `: J+ W" q" i& S- o#include <unistd.h>& {! ]8 K4 s, }: e1 F! X9 p* i
#include <sys/mman.h>
/ h3 L5 Y& {2 a/ t. i#include <sys/types.h>. y4 I) B. q5 @+ \2 O
#include <fcntl.h>
6 Z9 g9 F1 }( F: p: B& W/ j
& r& w8 ~: w1 h; ^#define SHAER_RAM_BASE_ADDR    (0x80000000)3 e3 C! c0 T5 R' W7 f
#define SHAER_RAM_SIZE         (0x20000)   ! n: _  B( K. ]2 `1 ~( h# V

/ v4 H- d# M8 Q. N8 {0 Ftypedef struct
" l! o) e' n. p( o! o8 C' v3 @{  Q7 i1 b/ l* p- ]/ g* z0 e! d, v. i
        unsigned int a;
" Z+ R; c7 }" @1 Z9 \        unsigned int b;5 l' h; c! P2 v1 Z
        unsigned int packet_cout;
) X+ |8 _( a& L6 C- u* K" q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  n3 E: {: M; e0 @6 S% _5 h! p3 ]
7 x4 g# |, ^# W1 p* y! V
void read_MSG_buffer(int *baseaddr);$ B# i3 x7 c# W* m) Y* I# y, \" H) M
unsigned int count_copy = 0;
9 x9 \2 y! @3 ?2 S8 u: d& }& Q. ^: p* Q4 ]
int main()" d. s% j6 _+ c5 d
{
3 l3 b  l% \. d) h: r4 g3 z# z        int fd;
% P9 S4 E; J- M: u( |        int *mem = NULL;
8 _+ z0 z  c2 g' X3 D/ u0 t
9 z' N# H) H; v1 `* f        if((fd = open("/dev/mem", O_RDWR)) <0)4 Z# j/ C0 n; j
        {
! \$ F9 ]& i9 v7 {6 L                perror("open error");! \. t. m. ~6 {9 ]
                return -1;/ m: S/ y5 U' _, q+ D8 ]
        }
0 S6 \. Z, ?% }4 i+ [! _        0 b3 P# m0 N6 e) U
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  M( Z5 {1 C- T$ g$ g. ^# e

+ q, u, x+ C  z9 Z$ L& L- @        while(1)
: J4 J( Z0 J' f% _7 R1 W* R        {) L' |5 a. ?4 K" b+ x
                read_MSG_buffer(mem);& A  u4 O$ d1 U2 \2 i9 \( ?% B) ~
        }                9 V" C; U5 {5 M5 {
}+ M* p5 u6 r' r0 d' |. N
1 b' g, V! b! {4 V0 I/ d* l
void read_MSG_buffer(int *baseaddr)
8 I' k+ ^1 Z5 [3 D# ]- a{
6 y& D- x& o* ]- o" }+ p# C: A        pRX_MSG_PROTOCOL pshreRAM = NULL;
! B; [8 k- R* Q# Y7 q/ R$ `2 [/ V* k' o6 }8 p
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' g. i$ W6 z2 C+ J9 O+ C' a

6 A; D9 ~0 B( z7 O2 I3 u- t        if(pshreRAM->packet_cout != count_copy)9 j1 N* M! q" p/ L% I0 V8 f
        {
% m6 A  M/ e4 M                printf("a is %d\n", pshreRAM->a);
* ?7 t- k- t6 @                printf("b is %d\n", pshreRAM->b);
  B; H9 F) T" H/ ]5 T/ a9 B+ V                printf("count is %d\n", pshreRAM->packet_cout);
+ N- m  x2 R; s( P$ c1 ]                count_copy = pshreRAM->packet_cout;; {6 A* }2 e7 G: w. w0 p
        }
2 M8 N( F! [1 t+ k- C' N! H        else4 v! s" x: v4 W) @4 Y7 P2 ~
        {
: i# O1 B+ z5 ~9 }; s& E/ h                printf("No effective message!\n");
( C5 _+ a4 |7 L' ~2 R( y9 `        }
  ~/ r4 G( L% q: J}
. D% t# k) R" q) Q3 f1 H( U& D$ n5 ?& d8 U/ u* j, x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# j0 u$ B/ Q  H  C% m

/ m, T7 s' B# p7 _! _
) L6 P/ }) V  q0 N" B1 n, _3 e* x* O% r6 X3 I& K& {% I  O

, K# P# X9 z1 j: N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-20 23:23 , Processed in 0.039325 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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