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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& h* S6 E4 Y4 @9 L3 p7 r8 C& D
' w& N& Q4 o# H0 k& B6 e0 VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" y. x  _0 B/ F& X  L' \* }, w
#include <unistd.h>
# m" l) _( c% @8 n0 y) w, c- I#include <sys/mman.h>2 u/ S/ {- T4 I* I$ o8 c1 ^' u$ D% p
#include <sys/types.h>4 }4 _" Z- c* s! u  U
#include <fcntl.h>- N6 S1 @1 I9 _6 Z) Y
+ s- |* Z- A: Q2 {+ B1 H* p
#define SHAER_RAM_BASE_ADDR    (0x80000000)   / a( j( O$ W9 w* X
) @6 `. j5 s6 q6 r) E  H
typedef struct
6 N& `$ T/ S# K{
- g% u& \3 a3 q        unsigned int a;8 t5 W- H! ]! F" [# i- S; S  a: a
        unsigned int b;
+ W/ ~( U! l3 |1 Z6 G. C. z        unsigned int packet_cout;, B" t' D! Z2 o! @; {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 e  v8 V! d3 _8 j

2 z/ H$ V) X% P5 `8 W; `) s$ Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! p" u+ I) W8 M. L9 s) wunsigned int count_copy = 0;
# q* F% ^9 T% }: V5 K. p2 n
- o) |8 {% I; Q' n' M) f
) K; D& k1 c5 {* s9 g4 xint main()# n0 u, F# h9 q8 K
{$ E, M$ y  F4 c* ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;  M- b0 S# e6 X5 z# p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ e2 }, L: f: O+ G6 Q; q+ G4 S5 Y0 q0 D+ M
        while(1), z$ U" K6 o5 e* r; `
        {5 J6 H/ ~; A; f' K
                read_MSG_buffer(pshreRAM);
- X% ]1 M9 @2 a& v% i        }               
" K3 C  ~$ O! f) }* e- [}. z6 X1 Z0 S$ T+ m! I
2 a% o1 e. I( e1 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% p/ ?0 o6 p2 {8 @1 R8 g; n
{
; m  f' a" _. j1 C7 `        RX_MSG_PROTOCOL buf;
' b( O' Z- R% Y2 y        * n% P# l5 m+ y" h$ D
        buf.a = pshreRAM->a;2 C1 i$ T/ Y1 P9 G2 ?- G
        buf.b = pshreRAM->b;8 O, l* W, _" A% J" S3 b! {4 B
        buf.packet_cout = pshreRAM->packet_cout;. V9 `- S( `- G; f3 p
        : w2 c& U6 H9 {9 F& G0 g& H* x7 `
        if(buf.packet_cout != count_copy)6 g2 `; L2 }: B, |* S  @
        {
/ Z/ p4 t3 F. n, ~  h                printf("a is %d\n", buf.a);, y8 u$ p: l+ f& w- E
                printf("b is %d\n", buf.b);/ v5 I. k, M7 ?; G& |( D
                printf("count is %d\n", buf.packet_cout);2 Y) q1 y: c. ^& f& j
                count_copy = buf.packet_cout;
) M9 l. I# ^9 ^4 l8 K" F# {$ H        }' U! e3 J# K. a" Z9 f/ O1 c( U
        else
9 L# p- M& w- z9 X. M6 n! D        {6 `4 K: l: M# n+ M4 b
                printf("No effective message!");2 N; R) p0 x" Y$ f8 n4 T  F
        }
4 F1 C' K/ I2 r! \0 R% v}2 `! V/ n+ Y) E$ S, R

) u( C$ m- \' Z0 r5 {$ ^* g. s3 b- w% i# r, U" F  r4 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- C% v8 n2 _) Z4 U使用下面代码,对内存使用了mmap函数后:# v8 l1 H" [3 X: t8 G8 y, I4 g
#include <stdio.h>
- E) ~% ]7 d# b9 N8 s. g#include <unistd.h>
3 v7 b) B$ H1 p#include <sys/mman.h>- G' S. ]# J  ]! _9 g& h
#include <sys/types.h>
) x$ a" e2 T. S$ H6 ?#include <fcntl.h>
% ?$ \& B) V% c7 A% }, J& }9 |
& Z8 H& z% n8 p8 G) B! [#define SHAER_RAM_BASE_ADDR    (0x80000000)
# l9 B1 |/ M3 Q& K5 k: e% W! k$ R#define SHAER_RAM_SIZE         (0x20000)   6 F0 _! f& ~% L! o4 }1 @. O! h! i
9 w6 n  H! N* G, d) p
typedef struct
: ]% r( Z' R" m: @0 U$ a! W{; `# ]  j: u/ m% [
        unsigned int a;
; N) j0 U9 c0 Q* a' G) \( g- y$ @3 r- x        unsigned int b;
! s7 a4 K5 Z+ q# e/ i% B+ V        unsigned int packet_cout;
) d1 K0 j& s$ V; G! }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) F# U7 p8 K" E# d/ R$ Q$ U  Q5 k4 W: R
void read_MSG_buffer(int *baseaddr);
3 T- u: x1 U1 k& punsigned int count_copy = 0;! c& z( j  X5 g3 `  R$ f5 n9 e# G
, w' g' X4 D, ^
int main()0 S" `% Y, k" h' f
{
- M) y6 [5 N# b        int fd;9 B2 m' Y9 w0 v/ x" w- W
        int *mem = NULL;# [$ d; N4 T; ^4 L

6 W! N" q0 b$ F! {3 |1 I, {        if((fd = open("/dev/mem", O_RDWR)) <0)( H3 P6 `( V& a/ k
        {
2 g( L! a. m* }                perror("open error");2 M( U5 n' k" R4 C7 z# v; V$ m6 _
                return -1;6 Y$ B% ^9 d3 }/ v! T
        }8 |! N2 f) q& G
        ( P- d& y. M2 L% a& m$ Y3 H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& q( t) _; n; A0 n; q& T: `% t
, k/ p: O7 n" j: N4 d% n/ m5 K/ ]        while(1)1 K6 ]# \' y, v$ [
        {6 z# j, p8 ]$ C0 L6 Y# k2 f
                read_MSG_buffer(mem);. Z; m  p2 x! N5 T
        }                - R1 [7 L0 H, }6 l
}
0 _" h4 _, S& J3 ~, M: P) n
+ d9 g, |4 J% z' ]void read_MSG_buffer(int *baseaddr)
* E0 ]' y8 v4 r3 X6 s' ]  e{
$ t" u9 |) x5 N; Z" T/ u4 F        pRX_MSG_PROTOCOL pshreRAM = NULL;" k$ t2 \; @; M) u; R7 {7 y' _

' w1 U; Y+ n; G! p# e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( G1 e* P& q1 N& G( B) C1 b) E% X! g% J. ^$ s8 u' V
        if(pshreRAM->packet_cout != count_copy)$ y3 l; Y! H8 [$ A% X' ?! l  Y) ?
        {
3 u5 B! X) M! _8 s$ f- m                printf("a is %d\n", pshreRAM->a);
. @, H' ?% U; [5 ?; x: e9 u/ W                printf("b is %d\n", pshreRAM->b);5 z$ s( E: e; V
                printf("count is %d\n", pshreRAM->packet_cout);
/ [9 J( \; r8 w$ g6 b6 J$ C0 v                count_copy = pshreRAM->packet_cout;
- f" n2 G1 g  G7 F% ~* \, M        }
/ a9 Q) S) E5 r3 n0 m8 O" B$ c; r8 D        else, {* E, C5 F3 E( Z$ L1 T+ y( @
        {
6 d; c" Y9 ^- N( c" Q: D; v                printf("No effective message!\n");
. ]  s5 Y* O2 i% ~9 ^        }
7 K0 y# u0 A( G}
2 {& B+ p* r' F6 [; r4 H
8 V- {8 f+ u, s6 O' y2 m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; U) M5 ?4 k4 c- }% L  i
/ j) |' z% V) `: [# L! T$ Y0 C& E/ W+ x
4 D: ^/ \4 O1 m# i- F2 l- L& e
  E  m9 c- U3 f# V5 ~9 ]" [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 08:30 , Processed in 0.054407 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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