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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ @2 K4 n# a( ~; C9 J$ I. I: C2 Z( H6 @2 X( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 ~# p+ ^) }# O$ t& e#include <unistd.h>
# `  f+ U9 U+ Y#include <sys/mman.h>7 J- O" {1 _7 B
#include <sys/types.h>( Z$ ?) \$ m) f7 P, ]" T! l
#include <fcntl.h>
, R# P# c, m, a& L; N* k+ R5 i1 q( A) ^% F( x1 [4 E# o9 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ X8 b3 B) ]$ W, S# j. Q1 \/ q: t' g: o9 Q8 Z% B8 [
typedef struct
1 q1 H- T- C* v+ h* E; Z{  Z: _: V- T& o4 y* E" K1 y# |; i, V
        unsigned int a;) \" @' z. z+ Q: {" ?
        unsigned int b;5 f" k+ ~  K; @6 T3 n9 g; c) ?, H9 d
        unsigned int packet_cout;. a4 ^$ Z& L0 w; r8 o, r+ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* R, m1 b8 s+ r$ @6 e1 Z% X: J
2 v2 p; W& @8 ~4 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" O: _8 p, i: Q7 lunsigned int count_copy = 0;
0 U; o" h6 }1 A* Z9 J" t
: @9 f1 R1 ?. y# f; O4 i5 _% _' a$ z0 E
int main()
' v5 v% G; x3 H{$ u% c5 w2 f0 p6 l) V. T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ o- h+ z' u2 I- t1 v$ j6 z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- Z  J' v* i: ]* v7 D' [. Y
* L/ M) H) K+ h( F1 b        while(1)
4 Y+ D2 M6 d8 T  W! w4 c" U5 D9 L4 a- i        {
6 i) }+ [" d8 \) u                read_MSG_buffer(pshreRAM);' M, k$ x% R" S: u' I, `9 N; H4 B9 \
        }               
: f8 j( a- W4 B; V}
9 `: \) Z8 [2 k2 |) `' l! y3 ~7 U' L7 `5 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), S1 x! z6 _- K7 j( }3 r# r2 G- T
{
' {  z- L# n0 @9 p        RX_MSG_PROTOCOL buf;
3 t5 g, a8 D/ B$ g8 U) [/ N        ! p# B" C7 w7 |+ D
        buf.a = pshreRAM->a;
* G% }7 q$ _3 |; I; J+ s        buf.b = pshreRAM->b;
8 O: [9 p; w$ }, }' y( A* Q0 H7 k        buf.packet_cout = pshreRAM->packet_cout;2 A! V3 A1 W" F% O8 a% ^
        ; k( A& p0 f! V" U
        if(buf.packet_cout != count_copy)
9 J( x# ~" {) V        {& A0 F- z3 S8 k2 P! g8 J6 p8 n
                printf("a is %d\n", buf.a);
6 U1 o0 k" f4 T: b. ?. n& @                printf("b is %d\n", buf.b);" H4 e: ?3 `7 {5 o9 p
                printf("count is %d\n", buf.packet_cout);
5 t! E! _  Q  |4 x                count_copy = buf.packet_cout;
. d2 V- w9 z9 ]        }, w2 Y, K# T0 V# l; a
        else
- A0 \& ^% f. J1 C  s/ d  y% Q6 |        {
) ?' d- o1 X% k                printf("No effective message!");
" ?3 d6 d3 L/ A1 T+ W& Z4 K        }3 ~4 @3 E! v$ w4 @) h: u
}
) }" b& s! S- {3 W- @4 X+ e) B0 D
7 H$ ]# ~1 h2 u, H$ v  V2 t. h+ _# j( o5 @/ }# }& A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ L! L4 h; a. z4 x; C3 R" w9 a使用下面代码,对内存使用了mmap函数后:, w' O2 T8 P, T
#include <stdio.h>
. {4 \' m! _( i% H#include <unistd.h>
4 M7 G5 [' X- G/ N7 T#include <sys/mman.h>2 o7 ~$ T" H0 O$ }3 G+ O  f0 b" V' _
#include <sys/types.h>
' E' q6 L' x7 \6 W. F#include <fcntl.h>
8 c* b* k$ H5 c5 b$ f; W* `$ f( P8 Q. Y" }8 g3 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: o1 L- u2 d& }0 H) l  K! I( a+ Z  K#define SHAER_RAM_SIZE         (0x20000)   & c* Z2 i  V, H* l9 Q3 z3 n) S

" ^7 d$ O8 U& I4 Btypedef struct
& w" s5 c5 E+ v  V7 \{
. H- V# L1 U; a+ A( O6 l        unsigned int a;
3 W2 a. q0 }/ c8 }: a# U! k        unsigned int b;! ?$ G6 y$ b# b& f/ z  ?, W' s; G
        unsigned int packet_cout;
% M4 H& |. S* |2 C: C6 W% N' ~5 x- M0 J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% G* v5 J0 F! |6 h
1 E" p3 C  v1 [/ H, {  V" ~void read_MSG_buffer(int *baseaddr);  Q$ a! e4 E5 G% ~( S' L) u
unsigned int count_copy = 0;
( w7 _0 u$ O' o: F5 \" |) `5 v: i! L7 n/ x8 ^1 W' u
int main()
" r& Q& j5 {: ~. K: j{4 G$ S+ I6 h8 U2 [* K8 b9 Z2 M5 K
        int fd;
- [. c$ T9 b1 y+ J( e- l        int *mem = NULL;
5 E0 R# r1 Y& n5 ~# y' N5 K. L$ C1 x" d
        if((fd = open("/dev/mem", O_RDWR)) <0)8 K1 T) X5 R. T  O: J# k5 }. \
        {
' H1 l# k3 ?1 H- k2 F                perror("open error");  S3 V6 o8 Q& B# S
                return -1;
8 R5 J' R. B7 X/ H3 p) t        }# |; \4 ]$ l5 y7 ?
        
8 Q. F* m: R3 h7 e) ?1 P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 @2 q: g- U9 n$ s4 {# F# n) v
, d" G: B" q6 U- {7 L/ C        while(1)
; L" p( J8 f& K" A: t1 h        {
1 R% N# |6 x. _3 M/ i/ n                read_MSG_buffer(mem);
* c3 B. k5 @$ h. v) ?        }                + ^1 [: @; [2 Q' G' Z. H
}# ^5 W3 v1 u; ?: d' p

. W& M8 W- Z- w0 Z. Dvoid read_MSG_buffer(int *baseaddr)1 L) p: z# X& ~# J
{
( u) V% S" d  k8 k0 z3 r        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ L, }- ]9 g/ D" f1 W! K* \& d, S4 Z" ^2 N. z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# I) V  ^- F" J' b6 v0 p6 G
+ I% n; v1 E8 Q* Q7 V8 p/ N
        if(pshreRAM->packet_cout != count_copy)" U/ U) m% b# @1 i5 J
        {7 b. T/ m; d5 k
                printf("a is %d\n", pshreRAM->a);
0 M/ q/ f4 @5 S$ K8 H" U                printf("b is %d\n", pshreRAM->b);
: T  @1 K! B  s0 S                printf("count is %d\n", pshreRAM->packet_cout);
( `  R# ]7 b' l* M; {                count_copy = pshreRAM->packet_cout;  i2 Y1 P. o. v. i- x3 ~; p" t: e+ S
        }
( H+ y0 T+ i& \$ H% J* J        else+ e' h/ g& c# W$ v- G) G& _  H) x. i
        {9 I" E  |! h& B. H
                printf("No effective message!\n");
- I) K+ @7 d4 }        }; R, O1 E0 h7 a$ p" ]
}$ {' K" I0 H  o
. @5 U9 C% ^: O) V+ A7 g0 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& a3 s% z; \3 i
9 i% i7 ~& E; d- a5 _  ]

* j- L4 c9 p( x" s8 K, s* [: w% |3 w9 n: [

4 @. D3 x8 P/ d0 Z* Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-11 12:17 , Processed in 0.040536 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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