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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) m" |& a0 A, n' J7 B
' O* ?, G7 @  N9 k* U* i3 R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 r: g: \1 g' k3 `- ?4 g( ], y: e#include <unistd.h>
8 O) |$ b1 ^0 ]; F% U+ I# ]1 Z#include <sys/mman.h>6 G) F. \- d# Z* C. Y3 `
#include <sys/types.h>
) e/ Y2 K, f5 n( W- A3 j#include <fcntl.h>6 v5 p, v, M9 U- i# Z9 P+ N& m

6 t' h9 W3 ]& m#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 C3 d* H+ \/ P; }

' }) j0 l+ c) O; h; g) Ctypedef struct8 I9 Y2 ~' ^; w' U( ?
{
7 \% H) f5 G( w* B        unsigned int a;
1 z7 ~" g$ `  t. F" K8 U$ W) [        unsigned int b;+ n$ V1 }- T9 R3 X1 P* v
        unsigned int packet_cout;
# R$ ]6 W+ Q: A5 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- F* S% s+ P) @0 M* |
8 V$ {: A$ ^4 o8 V; zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  n9 p. Y' i' Q6 A' V/ wunsigned int count_copy = 0;, z+ D! a; Q* m8 m

6 C9 J$ C) H$ Q8 Q# X0 r9 t* o$ ^! o) }3 a. x6 E
int main()
5 a3 h$ y  q/ u4 ~6 F; h{
, ~* n* ~3 I) ]6 a+ w! ]9 S3 [        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ Y' ?6 J+ W' h5 u2 N        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  E! v1 I$ W+ ]' w( O' J
+ R1 w$ L) x. J8 a4 O2 C# k
        while(1)
1 w/ F" `1 ^* F0 b4 p" ?/ s        {. ]$ t; K: p- |
                read_MSG_buffer(pshreRAM);$ ?5 ^: K" ~& K$ @2 c8 R0 c( Q
        }               
! i; |  x# g7 D) @1 z, v) D}4 u( [- T+ F8 ]# m

7 f! Z1 C( I: A! G4 {) O& a+ E$ xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* o# W) m. P2 l+ ^+ z0 H{" S: h0 g3 `+ L& X7 B
        RX_MSG_PROTOCOL buf;) [5 t/ Q1 r& |6 ?" d; u7 ~
        
9 |8 ]$ Q, h( E, Q, d        buf.a = pshreRAM->a;# h+ q& q& P4 o& Y/ k5 N  H% Q$ J8 U9 ?
        buf.b = pshreRAM->b;- u1 K% C" R0 ?
        buf.packet_cout = pshreRAM->packet_cout;4 j- n3 X% |, t* {) j, H# q* j- R3 R
        3 m3 L  N7 A& X: {
        if(buf.packet_cout != count_copy)
; E) |$ z+ [% J. E6 R1 m8 j. b        {" Q4 u( H7 v$ ]4 Q
                printf("a is %d\n", buf.a);
% x: t% G: O+ O) v: C                printf("b is %d\n", buf.b);
  s6 {1 e9 _! c; h                printf("count is %d\n", buf.packet_cout);
& x9 l+ R5 k! p/ @: U' q& `                count_copy = buf.packet_cout;; g' |, M4 i9 n0 ~0 P
        }
' D3 W8 E6 o3 f  Z0 _/ m0 V        else! z% G, y" }5 ~) Z) _9 y3 Q
        {
! [) \1 T4 t" d6 E4 ^4 v                printf("No effective message!");
4 ?, ^: v/ Q/ x- u* _( d        }
4 \' j6 B, z3 U  }3 ^" k' h}
9 }# r* ^- k4 U7 m% W. m; v4 ?% i
) Y5 F6 B6 G; m. U. ^$ I7 O0 F- l
  G" H. o* x0 z9 y) T  G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 H0 V: x% F4 G' Y+ p使用下面代码,对内存使用了mmap函数后:
& e& m- l5 r/ q2 S#include <stdio.h>- Z/ }/ R, n' c7 d4 Z
#include <unistd.h>( M( j# Y* s- W! [" a4 p$ s
#include <sys/mman.h>
' R& S. ]) r# @  x4 Z#include <sys/types.h>
2 C7 t- Z. B( R4 M#include <fcntl.h>% g# A1 C$ U2 E' S) N8 U) m% Q
; U( h* U: r5 ]6 w0 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. n) P, V9 f0 \1 b" g: j6 T#define SHAER_RAM_SIZE         (0x20000)   2 @2 Z$ @" f7 r7 L6 x# a

% `, D1 D. b& |( r. I  ztypedef struct. l* X0 X" T9 s6 ^
{/ P3 p* M* d0 `# u+ e$ G) R4 `% [
        unsigned int a;
+ m5 {& m  V; a4 G/ x3 c4 L        unsigned int b;
5 n* _, }, `0 W        unsigned int packet_cout;
6 Q& E; ~4 `+ g1 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ P+ D6 i" B* E* ?0 |: r3 N
9 k/ ~0 Y5 g4 o) ~: {
void read_MSG_buffer(int *baseaddr);+ r) b7 L3 J, {' @' b; r8 Q
unsigned int count_copy = 0;7 n1 h/ Q% @' N

6 V2 i; N, E8 Rint main()
2 `/ v* j1 d4 @% U7 \{* W, A6 q9 l. C2 j) ~1 B! M
        int fd;( `/ i$ M, e/ g7 F7 m* u
        int *mem = NULL;
( i4 l+ I" r( v1 x
1 O0 k2 e. y, z        if((fd = open("/dev/mem", O_RDWR)) <0)0 ~5 F4 R7 G, D6 x, D
        {( z5 x5 d9 K/ x  ?
                perror("open error");* M% V- r$ F! X8 ~( q2 g
                return -1;5 |5 c$ \* ]! J6 Y* C4 o7 K
        }3 J6 g; T- p( |
        
2 q0 l9 u9 ^. Q. _# R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 h6 a, V) W8 N. u4 z, Y, W: ]+ T" P( m+ d
        while(1)& B7 \* i2 v; v* M% I
        {
. v& B2 z/ r6 w  L5 ?                read_MSG_buffer(mem);
- C9 X$ e% y6 Q8 x  H. u        }                ! ~! t6 I1 K: y% I- u8 M  M
}" v! S; S- K1 `* l" R
9 S/ a8 ^: u; Q9 S
void read_MSG_buffer(int *baseaddr)
: u6 D: ~9 I- ^! K' m; a% V{
2 Q) O: h: m5 q2 h; d        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ ^- Q: B# `7 F1 @6 z; v$ n
2 k# w! R$ T, n3 y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! D& _* d, `! a% l1 \
1 |+ ?7 Q. o' I+ N1 i  F, E0 ~# O        if(pshreRAM->packet_cout != count_copy)) g2 J5 D' [5 W1 p! w; {% C* L8 x! e' \
        {
) z" U% x4 \6 p6 i. S                printf("a is %d\n", pshreRAM->a);
. B0 M% P, ?! H# h6 X                printf("b is %d\n", pshreRAM->b);
  V) R8 e  u6 ~& E5 n( Q                printf("count is %d\n", pshreRAM->packet_cout);6 b2 r6 r9 |% u" g( K2 j; n
                count_copy = pshreRAM->packet_cout;& G( [3 C& H* m* O7 S
        }
/ C6 W* F( \% j) U2 B# ~. R        else3 _+ f/ h7 I' T3 M
        {( [- r; V) t9 F( E
                printf("No effective message!\n");
- C. \8 |+ o2 z4 {; h0 r        }
8 M1 k+ x  d' n$ _' [}! H% L4 z) X4 T. f/ o
% w$ j$ |6 w+ ]) u6 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' e' l- z! ?% K% L% c* r  i, K5 c
; s: ~# z' g: \# ?$ g# U  N

$ {8 C* J8 D" T$ a6 Q$ g& n3 S4 t$ m  ^: |% ~: X4 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-7 08:24 , Processed in 0.041066 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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