OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' {* K; p2 z+ A# _" q7 H; p: \
  m3 V' G) h- j4 U( P2 K& ~& N7 {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- Y. F. x; V* W8 d  F
#include <unistd.h>
' e% C# {% w, i( S1 z/ v#include <sys/mman.h>
" q9 M. y$ O8 U" L0 ?" v#include <sys/types.h>
  _1 U/ @: J3 G* h  x$ c% m5 F' N#include <fcntl.h>; j- d" h7 S& w) J

9 ?: ?/ a  t" L/ G1 T; C#define SHAER_RAM_BASE_ADDR    (0x80000000)   # C& @) y, ]# p( s

4 c0 F9 h; {+ E. N: ftypedef struct' u9 u' A; ]! H
{0 l( T% t1 q" R% U4 |
        unsigned int a;
7 J* g: G3 t% y) a# Q% Q        unsigned int b;
0 I4 `  [: Y1 {4 b. }        unsigned int packet_cout;
4 g. }9 ?9 X& i! P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# G. R8 g  ]# Z2 X1 w
$ c7 B0 Z$ I- A' K, J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# F; `9 m6 V- G1 L% c% J2 n% n% wunsigned int count_copy = 0;
" Y/ q) R" W+ G  Y9 X, M! w* c7 O0 ^! @/ o2 K7 l. v
6 i( o6 C2 q. N% f  ~! Q# I8 [8 U
int main()
. Z5 r3 J4 q9 o7 Q8 W8 O{
" S: v1 `- J/ B        pRX_MSG_PROTOCOL pshreRAM = NULL;) m; c: n( w, g$ @; |% H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* P0 R) A5 i9 z1 ]: b% n: ^* a$ D9 u0 V' \2 {# }7 Z
        while(1)
' t1 I! t, c& W/ E+ {6 Q        {
; x2 D  R+ W, ], g$ v                read_MSG_buffer(pshreRAM);
6 C2 ?8 ]9 l* y2 u& t( |$ W, R+ |        }               
9 b$ n+ o( p+ A& @}  F9 w+ B7 y0 j/ y8 f5 D, e; R
" N, w5 \/ ?) l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). H7 p# l* I# ~- Q  U" F5 y; T- t
{% u5 M- D8 V5 g
        RX_MSG_PROTOCOL buf;4 i9 E4 n0 g) j0 a4 N0 H5 j7 X  A1 {
        
! C0 n0 _, K; A: S) @" X2 {        buf.a = pshreRAM->a;# ]$ }* Q# w& N" _2 O: H, N
        buf.b = pshreRAM->b;1 w% f8 I1 r3 i/ c# v
        buf.packet_cout = pshreRAM->packet_cout;
2 E6 F% m. }7 v. l7 O4 A7 T  [        9 U3 y* K. Y+ [% F1 i
        if(buf.packet_cout != count_copy)9 g) W) `" b! P; {( k7 E. w
        {5 u) t$ I; q* a$ |
                printf("a is %d\n", buf.a);
& d% f& u0 n5 B7 {- g& q                printf("b is %d\n", buf.b);
5 G+ c7 ~3 [/ F) T, i                printf("count is %d\n", buf.packet_cout);( P+ g: M3 p" o) `
                count_copy = buf.packet_cout;
+ H4 [5 G5 A2 J        }
$ ?& P: F. F% u) N        else
: S- P! z6 x4 c8 E& B- t        {/ j6 A$ R2 F" E' q6 \% j5 B
                printf("No effective message!");% `& s1 P/ y: s8 X; Y) A
        }* f% d% U1 I  S4 `9 d
}( n& n( v+ q9 Y! j0 u) z* d
! C& X# _9 H4 ?3 d. q$ [9 X2 o
' W7 [1 r! K7 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  s5 c- ~9 |8 s; R使用下面代码,对内存使用了mmap函数后:
/ f; w& N8 Q% T9 ?. ^#include <stdio.h>6 T% a- c+ {3 G" L+ z
#include <unistd.h>) \' K/ @/ r# A. I" \0 C0 m8 L8 z
#include <sys/mman.h>( J2 j$ E4 b% H4 S% n6 E
#include <sys/types.h>
4 ?% L: Q2 z7 }, E* C' V3 s2 x8 Q#include <fcntl.h>
4 [8 d6 p- ?" b
% z8 s% K. @" A5 n4 ]0 s#define SHAER_RAM_BASE_ADDR    (0x80000000)2 q7 b( g: W. U+ I6 L3 Q
#define SHAER_RAM_SIZE         (0x20000)   
8 x, ]/ s  t; i  z0 m4 [( t
# W9 K9 ?) o- xtypedef struct
) o4 i3 u& t; B4 M' g1 K* n0 ?{
8 M. O; H  h$ L/ e0 P5 s1 ?        unsigned int a;7 k) K5 A5 H; R& K! l0 ]
        unsigned int b;
" Y3 r7 w3 e  `        unsigned int packet_cout;/ w7 d+ s  b$ H: c: P  p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  j9 K& X+ W, w6 N4 j" O" V

; _$ d7 v8 V  D2 a) |- J& o2 ~void read_MSG_buffer(int *baseaddr);5 _. x! S1 u2 V2 R/ J
unsigned int count_copy = 0;' X6 E1 I# B0 ?3 l; C) P3 F/ ]6 }

' C- w& |, a4 T" Mint main()' y6 H' S4 k" d/ c6 U
{
& z* `' b! f5 U# B5 g5 l1 s        int fd;% d' ?' o( [, C/ T
        int *mem = NULL;8 d" W/ |9 l" \9 L
4 c0 N' }0 Z2 ?& c( |  P
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 o5 q" w5 J/ e( e8 A        {) N. N# @6 T8 S3 k
                perror("open error");
7 l6 d0 w, K( V# v: M1 F, L                return -1;1 V8 Y) p' K) r! t0 i
        }* q! a2 z- [/ O9 N: ]  ?
        
5 H: m" q6 l- w/ Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% j# t) R. e8 ~# H/ X+ G  j

5 p6 u$ c$ E- n* M( ]3 d        while(1)0 z, F: v' H% j
        {5 M% X5 Z, D" V$ Z6 \
                read_MSG_buffer(mem);; q: Z* @7 L" T+ g* x
        }                1 g7 P- G/ {! i: ^, Z5 R/ I
}
4 \/ x) Z# C1 N$ B" }
! w, R; A% w, A2 o' _void read_MSG_buffer(int *baseaddr): L) H5 m. R# ]( w3 R
{  y3 G7 L/ t- |$ D7 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;) x9 y/ V% w: K. t" [3 v
. E" \  d! \- [1 v" P
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  Z7 S/ O7 z7 C3 ?( T
& j0 J4 z" ^$ t: i! d8 }8 A) t. z        if(pshreRAM->packet_cout != count_copy)
: D, Y! d/ Y4 D) K        {, A( U' l+ W- _. C) y# A9 c
                printf("a is %d\n", pshreRAM->a);
# D2 C9 n8 a+ H2 d* e9 y5 B                printf("b is %d\n", pshreRAM->b);
% `* t$ M" \+ V# g8 ^                printf("count is %d\n", pshreRAM->packet_cout);
. b0 U3 |* g7 p" r/ {* ^* T$ X                count_copy = pshreRAM->packet_cout;
5 V+ \* y( W; W- o        }! [& z1 e8 Y) k( }2 o  Z
        else
) ~: `! Z( f& A$ a! l        {, w" G9 [# c6 p5 F+ ~8 N( h
                printf("No effective message!\n");: v" t9 F2 A, ~: U' p; {
        }
; x2 E. g1 E% P9 U3 w1 q}# R2 M2 n, {% ~  ~) c7 ?
: `) r. ]% y; j7 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* }& _6 _1 e$ D( x9 v) n( ?7 }

6 |0 t. E& N$ u' V! K& O
+ N$ ]5 G" p8 j
8 m. N! c" ]! z3 x3 g' ?' N& I+ ?/ b$ m0 H9 ^0 X; f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 04:55 , Processed in 0.038110 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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